-
-
Save mRokita/74e4ee0e375397f3dda781c4e18b2370 to your computer and use it in GitHub Desktop.
dplogin client
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from hashlib import md5 | |
from urllib import urlencode | |
import urllib2 | |
import cookielib | |
import re | |
PATTERN_USER_ID = re.compile("User ID: (\d+)") | |
PATTERN_CLANS = re.compile("/index.php\\?action=viewclan&clanid=(\d+)\\\">(.*?) \\- (.*?)</a>") | |
PATTERN_PROFILE_DATA = re.compile("name=\\\"(.*?)\\\" value=\\\"(.*?)\\\"") | |
PATTERN_PROFILE_BIO = re.compile("name=\\\"(bio)\\\" wrap=soft>(.*?)</textarea>", re.DOTALL) | |
PATTERN_MEMBERS = re.compile("(?:<b class=\\\"faqtitle\\\">(Leaders|Former Members|Invited Players Pending|Players Requesting Membership):</b></td></tr>)?<tr><td><a href=\\\"/index\\.php\\?action=viewmember\\&playerid=(\d+)\\\">([^<>]+)</a></td><td>.*?</td></tr>") | |
def get_password_hash(password, user_id, session_id): | |
return hex_md5(hex_md5(hex_md5(password + "DPLogin001") + user_id) + session_id) | |
def get_new_password_hash(password, user_id): | |
return hex_md5(hex_md5(password + "DPLogin001") + user_id) | |
def hex_md5(string): | |
return md5(string).hexdigest() | |
class DPLogin: | |
def __init__(self, username, password): | |
self.__cj = cookielib.CookieJar() | |
self.__opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.__cj)) | |
self.__opener.addheaders = [ | |
('User-Agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100102 Firefox/46.0)') | |
] | |
self.username = username | |
self.password = password | |
response = self.__opener.open("http://dplogin.com/index.php", | |
data=urlencode({"action": "weblogin1", "username": username, "pwhash": ""})).read() | |
try: | |
self.user_id = PATTERN_USER_ID.findall(response)[0] | |
except IndexError: | |
raise TypeError("User {} doesn't exist.".format(username)) | |
self.session_id = None | |
for cookie in self.__cj: | |
if cookie.name == "PHPSESSID": | |
self.session_id = cookie.value | |
pwhash = get_password_hash(password, self.user_id, self.session_id) | |
response = self.__opener.open("http://dplogin.com/index.php", | |
data=urlencode({"action": "weblogin2", "username": username, "pwhash": pwhash, "password": ""})).read() | |
if "Invalid password" in response: | |
raise TypeError("Wrong password.") | |
def get_clans(self): | |
response = self.__opener.open("http://dplogin.com/index.php?action=main").read() | |
data = PATTERN_CLANS.findall(response) | |
has_active_clan = len(data) and ">Active Clan<" in response | |
clans = [] | |
i = 0 | |
for clan in data: | |
clans.append({"id": clan[0], "name": clan[1], "tag": [2], "active": has_active_clan and not i}) | |
if not i: | |
i = 1 | |
return clans | |
def leave_current_clan(self): | |
for clan in self.get_clans(): | |
if clan["active"]: | |
self.leave_clan(clan["id"]) | |
break | |
def leave_clan(self, clan_id): | |
return self.__opener.open("http://dplogin.com/index.php?action=leaveclan&clanid={}".format(clan_id)).read() | |
def join_clan(self, clan_id=None, clan_name=None): | |
if not (clan_id or clan_name): | |
raise TypeError("Not enough parameters") | |
if clan_id: | |
return self.__opener.open("http://dplogin.com/index.php?action=joinclan&clanid={}".format(clan_id)).read() | |
else: | |
return self.__opener.open("http://dplogin.com/index.php", urlencode({"action":"joinclan", | |
"clanname":"clan_name"})).read() | |
def get_profile_data(self): | |
response = self.__opener.open("http://dplogin.com/index.php?action=editprofile").read() | |
data = PATTERN_PROFILE_DATA.findall(response) | |
data.extend(PATTERN_PROFILE_BIO.findall(response)) | |
return dict(data) | |
def update_profile(self, newpassword=None, email=None, realname=None, birthdate=None, location=None, | |
displayemail=None, forumname=None, aim=None, icq=None, msn=None, yim=None, website=None, bio=None): | |
form_data = self.get_profile_data() | |
form_data["pwhash"] = get_password_hash(self.password, self.user_id, self.session_id) | |
form_data["password"] = "" | |
l = dict(locals()) | |
del l["form_data"] | |
del l["self"] | |
for var in l: | |
if l[var]: | |
form_data[var] = l[var] | |
if newpassword: | |
form_data["newpwhash"] = get_new_password_hash(newpassword, self.user_id) | |
form_data["newpassword"] = "" | |
form_data["newpassword2"] = "" | |
return self.__opener.open("http://dplogin.com/index.php", urlencode(form_data)).read() | |
def del_name(self, name): | |
return self.__opener.open("http://dplogin.com/index.php?action=deletemyname&name={}".format(name)).read() | |
def add_name(self, name): | |
return self.__opener.open("http://dplogin.com/index.php", | |
urlencode({"action": "addnewname", "newname": name})).read() | |
def create_clan(self, name, tag): | |
return self.__opener.open("http://dplogin.com/index.php", | |
urlencode({"action": "createclan2", | |
"clanname": name, | |
"clantag": tag})).read() | |
def invite_member(self, clanid, playerid=None, name=None): | |
if not (clanid or playerid): | |
raise TypeError("Not enough parameters") | |
if name: | |
return self.__opener.open("http://dplogin.com/index.php", | |
urlencode({"action": "inviteclanmember", | |
"clanid": clanid, | |
"playername": name})).read() | |
else: | |
return self.__opener.open("http://dplogin.com/index.php?action=inviteclanmember&clanid={}&playerid={}" | |
.format(clanid, playerid)).read() | |
def cancel_join_request(self, clanid): | |
return self.__opener.open("http://dplogin.com/index.php?action=cancelclanjoinrequest&clanid={}" | |
.format(clanid)).read() | |
def reject_join_request(self, clanid, playerid): | |
return self.__opener.open("http://dplogin.com/index.php?action=rejectclanjoinrequest&clanid={}&playerid={}" | |
.format(clanid, playerid)).read() | |
def make_leader(self, clanid, playerid): | |
return self.__opener.open("http://dplogin.com/index.php?action=makeclanleader&clanid={}&playerid={}" | |
.format(clanid, playerid)).read() | |
def kick_from_clan(self, clanid, playerid): | |
return self.__opener.open("http://dplogin.com/index.php?action=kickclanmember&clanid={}&playerid={}" | |
.format(clanid, playerid)).read() | |
def remove_clan_leader(self, clanid, playerid): | |
return self.__opener.open("http://dplogin.com/index.php?action=removeclanleader&clanid={}&playerid={}" | |
.format(clanid, playerid)).read() | |
def cancel_invite(self, clanid, playerid): | |
return self.__opener.open("http://dplogin.com/index.php?action=cancelinviteclanmember&clanid={}&playerid={}" | |
.format(clanid, playerid)).read() | |
def get_clan_members(self, clanid): | |
data = PATTERN_MEMBERS.findall(self.__opener.open("http://dplogin.com/index.php?action=viewclan&clanid={}" | |
.format(clanid)).read()) | |
members = {} | |
current_key = "" | |
for member in data: | |
if member[0]: | |
current_key = member[0] | |
members[current_key] = list() | |
members[current_key].append({"id": member[1], "name": member[2], "rank": current_key}) | |
return members |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment