Voting part 2
This commit is contained in:
parent
e762f269b7
commit
4528281ddd
4 changed files with 78 additions and 5 deletions
|
@ -24,4 +24,4 @@ Freeware = AppName+u""" comes with ABSOLUTELY NO WARRANTY!
|
||||||
This is free software, and you are welcome to redistribute it
|
This is free software, and you are welcome to redistribute it
|
||||||
under certain conditions. Look at the file `COPYING' within this
|
under certain conditions. Look at the file `COPYING' within this
|
||||||
distribution."""
|
distribution."""
|
||||||
|
VoteUrl = "XXX"
|
||||||
|
|
|
@ -3,8 +3,9 @@
|
||||||
# Copyright (C) 2012-2013 Bastian Kleineidam
|
# Copyright (C) 2012-2013 Bastian Kleineidam
|
||||||
import requests
|
import requests
|
||||||
import time
|
import time
|
||||||
from . import loader
|
from . import loader, configuration
|
||||||
from .util import fetchUrl, fetchUrls, getPageContent, makeSequence
|
from .util import (fetchUrl, fetchUrls, getPageContent, makeSequence,
|
||||||
|
get_system_uid, urlopen)
|
||||||
from .comic import ComicStrip
|
from .comic import ComicStrip
|
||||||
from .output import out
|
from .output import out
|
||||||
from .events import getHandler
|
from .events import getHandler
|
||||||
|
@ -226,7 +227,13 @@ class _BasicScraper(object):
|
||||||
|
|
||||||
def vote(self):
|
def vote(self):
|
||||||
"""Cast a public vote for this comic."""
|
"""Cast a public vote for this comic."""
|
||||||
pass # XXX
|
url = configuration.VoteUrl
|
||||||
|
uid = get_system_uid()
|
||||||
|
data = {"comic": self.getName(), "uid": uid}
|
||||||
|
page = urlopen(url, self.session, data=data, stream=False)
|
||||||
|
answer = page.text
|
||||||
|
if "voted" not in answer:
|
||||||
|
raise ValueError("vote error %r" % answer)
|
||||||
|
|
||||||
|
|
||||||
def find_scraperclasses(comic, multiple_allowed=False):
|
def find_scraperclasses(comic, multiple_allowed=False):
|
||||||
|
|
|
@ -21,6 +21,7 @@ import cgi
|
||||||
import re
|
import re
|
||||||
import traceback
|
import traceback
|
||||||
import time
|
import time
|
||||||
|
import subprocess
|
||||||
try:
|
try:
|
||||||
from HTMLParser import HTMLParser
|
from HTMLParser import HTMLParser
|
||||||
except ImportError:
|
except ImportError:
|
||||||
|
@ -59,6 +60,62 @@ if hasattr(requests, 'adapters'):
|
||||||
requests.adapters.DEFAULT_RETRIES = MaxRetries
|
requests.adapters.DEFAULT_RETRIES = MaxRetries
|
||||||
|
|
||||||
|
|
||||||
|
def get_system_uid():
|
||||||
|
"""Get a (probably) unique ID to identify a system.
|
||||||
|
Used to differentiate votes.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
if os.name == 'nt':
|
||||||
|
return get_nt_system_uid()
|
||||||
|
if sys.platform == 'darwin':
|
||||||
|
return get_osx_system_uid()
|
||||||
|
except Exception:
|
||||||
|
return get_mac_uid()
|
||||||
|
else:
|
||||||
|
return get_mac_uid()
|
||||||
|
|
||||||
|
|
||||||
|
def get_nt_system_uid():
|
||||||
|
"""Get the MachineGuid from
|
||||||
|
HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography\MachineGuid
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
import _winreg as winreg
|
||||||
|
except ImportError:
|
||||||
|
import winreg
|
||||||
|
lm = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)
|
||||||
|
try:
|
||||||
|
key = winreg.OpenKey(lm, r"Software\Microsoft\Cryptography")
|
||||||
|
try:
|
||||||
|
return winreg.QueryValueEx(key, "MachineGuid")[0]
|
||||||
|
finally:
|
||||||
|
key.Close()
|
||||||
|
finally:
|
||||||
|
lm.Close()
|
||||||
|
|
||||||
|
|
||||||
|
def get_osx_system_uid():
|
||||||
|
"""Get the OSX system ID.
|
||||||
|
$ system_profiler |grep "r (system)"
|
||||||
|
Serial Number (system): C24E1322XXXX
|
||||||
|
"""
|
||||||
|
res = backtick(["system_profile"]).splitlines()
|
||||||
|
for line in res:
|
||||||
|
if "r (system)" in line:
|
||||||
|
return line.split(':', 1)[1].strip()
|
||||||
|
raise ValueError("Could not find system number in %r" % res)
|
||||||
|
|
||||||
|
|
||||||
|
def get_mac_uid():
|
||||||
|
"""Get the MAC address of the system."""
|
||||||
|
import uuid
|
||||||
|
return uuid.getnode()
|
||||||
|
|
||||||
|
|
||||||
|
def backtick (cmd, encoding='utf-8'):
|
||||||
|
"""Return decoded output from command."""
|
||||||
|
data = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
|
||||||
|
return data.decode(encoding)
|
||||||
def unicode_safe(text, encoding=UrlEncoding, errors='ignore'):
|
def unicode_safe(text, encoding=UrlEncoding, errors='ignore'):
|
||||||
"""Decode text to Unicode if not already done."""
|
"""Decode text to Unicode if not already done."""
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
import re
|
import re
|
||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
|
|
||||||
from dosagelib.util import normaliseURL, unescape, tagre
|
from dosagelib.util import normaliseURL, unescape, tagre, get_system_uid
|
||||||
|
|
||||||
|
|
||||||
class URLTest(TestCase):
|
class URLTest(TestCase):
|
||||||
|
@ -50,3 +50,12 @@ class RegexTest(TestCase):
|
||||||
self.assertEqual(match.group(1), value)
|
self.assertEqual(match.group(1), value)
|
||||||
else:
|
else:
|
||||||
self.assertFalse(match, "%s should not match %s" % (matcher.pattern, text))
|
self.assertFalse(match, "%s should not match %s" % (matcher.pattern, text))
|
||||||
|
|
||||||
|
|
||||||
|
class UidTest(TestCase):
|
||||||
|
"""
|
||||||
|
Tests for unique system IDs.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def test_system_uid(self):
|
||||||
|
self.assertTrue(get_system_uid())
|
||||||
|
|
Loading…
Reference in a new issue