· 8 years ago · Sep 02, 2017, 10:28 AM
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4import requests
5import os
6import binascii
7from Crypto.Hash import SHA, HMAC
8import datetime
9from urllib import urlencode
10from collections import OrderedDict
11import urllib
12import json
13import random, string
14
15class askapi:
16
17 SIGN_KEY = '42E02265617E4B6DE18A6E991E4CC'
18 USER_AGENT = 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; google_sdk Build/KK)'
19 HOST = 'api.ask.fm'
20 PORT = '443'
21 DEVICE_ID = binascii.hexlify(os.urandom(8))
22 ANDROID_VERSION = "android_4.4"
23 API_VERSION = "1.7"
24
25 def __init__(self):
26 self.rt = 1
27 params = (
28 ("did", self.DEVICE_ID),
29 ("rt", str(self.rt)),
30 ("ts", self.timemill())
31 )
32
33 DATA_SIGN = ""
34 for v in params:
35 DATA_SIGN += "%" + str(v[0]) + "%"
36 DATA_SIGN += urllib.quote(str(v[1]))
37
38 headers = {
39 'X-Client-Type': str(self.ANDROID_VERSION),
40 'Authorization': 'HMAC '+self.generatorSignature("GET", "/token", DATA_SIGN),
41 'X-Api-Version': str(self.API_VERSION),
42 'User-Agent': str(self.USER_AGENT),
43 'Host': self.HOST+":"+self.PORT
44 }
45
46 r = requests.get('https://api.ask.fm/token', headers=headers, params=params)
47 self.rt += 1
48
49 self.accessToken = r.json()['accessToken']
50
51 def like(self, qid, uid):
52
53 data = {
54 'qid': str(qid),
55 'rt': str(self.rt),
56 'ts': self.timemill(),
57 'uid':str(uid)
58 }
59 data = json.dumps(data, sort_keys=False, separators=(',', ':'))
60 params = (
61 ("json", data),
62 )
63 DATA_SIGN = ""
64 for v in params:
65 DATA_SIGN += "%" + str(v[0]) + "%"
66 DATA_SIGN += urllib.quote(str(v[1]))
67
68 headers = {
69 'X-Client-Type': str(self.ANDROID_VERSION),
70 'X-Access-Token': str(self.accessToken),
71 'Authorization': 'HMAC '+self.generatorSignature("PUT", "/users/answers/likes", DATA_SIGN),
72 'X-Api-Version': str(self.API_VERSION),
73 'User-Agent': str(self.USER_AGENT),
74 'Host': self.HOST+":"+self.PORT
75 }
76
77 r = requests.put('https://api.ask.fm/users/answers/likes', headers=headers, data=params)
78 self.rt += 1
79
80 if r.json()['status']:
81 return True
82 else:
83 return False
84
85 def register(self, uid, email, password, fullName, genderId, birthDate): # username, email, password, FullName, gender : 1 = Famle, 2 = Male, birthDate = 28.8.2017
86 data = {
87 "adid": "9cd533c5-6f92-43fe-b49e-bc4a544dcea8",
88 "did": str(self.DEVICE_ID),
89 "gmt_offset": "0",
90 "guid": str(self.DEVICE_ID),
91 "pass": str(password),
92 "referrer": "null",
93 "rt": str(self.rt),
94 "ts": str(self.timemill()),
95 "uid": str(uid),
96 "user": {
97 "avatarUrl": "null",
98 "birthDate": str(birthDate),
99 "email": str(email),
100 "fullName": str(fullName),
101 "uid": str(uid),
102 "lang": "en",
103 "genderId": genderId
104 }
105 }
106 data = json.dumps(data, sort_keys=False, separators=(',', ':'))
107 params = (
108 ("json", data),
109 )
110
111 DATA_SIGN = ""
112 for v in params:
113 DATA_SIGN += "%" + str(v[0]) + "%"
114 DATA_SIGN += urllib.quote(str(v[1]))
115
116 headers = {
117 'X-Client-Type': str(self.ANDROID_VERSION),
118 'X-Access-Token': str(self.accessToken),
119 'Authorization': 'HMAC '+self.generatorSignature("POST", "/register", DATA_SIGN),
120 'X-Api-Version': str(self.API_VERSION),
121 'User-Agent': str(self.USER_AGENT),
122 'Host': self.HOST+":"+self.PORT
123 }
124
125 r = requests.post('https://api.ask.fm/register', headers=headers, data=params)
126 self.rt += 1
127 self.accessToken = r.json()['at']
128
129 def follow(self, uid):
130
131 data = {
132 'rt': str(self.rt),
133 'ts': self.timemill(),
134 'uid':str(uid)
135 }
136 data = json.dumps(data, sort_keys=False, separators=(',', ':'))
137 params = (
138 ("json", data),
139 )
140 DATA_SIGN = ""
141 for v in params:
142 DATA_SIGN += "%" + str(v[0]) + "%"
143 DATA_SIGN += urllib.quote(str(v[1]))
144
145 headers = {
146 'X-Client-Type': str(self.ANDROID_VERSION),
147 'X-Access-Token': str(self.accessToken),
148 'Authorization': 'HMAC '+self.generatorSignature("PUT", "/friends", DATA_SIGN),
149 'X-Api-Version': str(self.API_VERSION),
150 'User-Agent': str(self.USER_AGENT),
151 'Host': self.HOST+":"+self.PORT
152 }
153
154 r = requests.put('https://api.ask.fm/friends', headers=headers, data=params)
155 self.rt += 1
156
157 if r.json()['status']:
158 return True
159 else:
160 return False
161
162 def askSomeone(self, usernames, qBody, type='anonymous'): # types: anonymous,user
163 data = {
164 'question': {
165 'type': str(type),
166 'body': str(qBody)
167 },
168 'rt': str(self.rt),
169 'ts': self.timemill(),
170 'users':usernames
171 }
172 data = json.dumps(data, sort_keys=False, separators=(',', ':'))
173 params = (
174 ("json", data),
175 )
176
177 DATA_SIGN = ""
178 for v in params:
179 DATA_SIGN += "%" + str(v[0]) + "%"
180 DATA_SIGN += urllib.quote(str(v[1]))
181
182 headers = {
183 'X-Client-Type': str(self.ANDROID_VERSION),
184 'X-Access-Token': str(self.accessToken),
185 'Authorization': 'HMAC '+self.generatorSignature("POST", "/users/questions", DATA_SIGN),
186 'X-Api-Version': str(self.API_VERSION),
187 'User-Agent': str(self.USER_AGENT),
188 'Host': self.HOST+":"+self.PORT
189 }
190
191 r = requests.post('https://api.ask.fm/users/questions', headers=headers, data=params)
192 self.rt += 1
193
194 if r.json()['status']:
195 return True
196 else:
197 return False
198
199 def generatorSignature(self, method, endpoint, data):
200 return HMAC.new(self.SIGN_KEY, method+"%"+self.HOST+":"+self.PORT+"%"+endpoint+data, SHA).hexdigest() # Pattern METHOD%HOST:PORT%ENDPOINT%DATA
201
202 def timemill(self):
203 return str(int((datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)).total_seconds() * 1000))
204
205
206ask = askapi()
207
208email = ''.join(random.choice(string.ascii_uppercase) for _ in range(16)) + "@gmail.com"
209username = ''.join(random.choice(string.ascii_uppercase) for _ in range(16))
210password = ''.join(random.choice(string.ascii_uppercase) for _ in range(16))
211print "EMAIL: " + email
212print "USERNAME: " + username
213print "PASSWORD: " + password
214ask.register(username, email, password, "Mohamed Ahmed", 2, "28.6.1998")
215print "Account has been successfully registered"
216ask.like('141000540388', 'SayedAElhafiz')
217ask.follow('SayedAElhafiz')
218ask.askSomeone(['SayedAElhafiz'], 'Hi')