Skip to content

Instantly share code, notes, and snippets.

@mRokita
Created May 21, 2016 21:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mRokita/74e4ee0e375397f3dda781c4e18b2370 to your computer and use it in GitHub Desktop.
Save mRokita/74e4ee0e375397f3dda781c4e18b2370 to your computer and use it in GitHub Desktop.
dplogin client
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