Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2014
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.33 KB | None | 0 0
  1. import socket
  2. import re
  3.  
  4.  
  5. def get(host, port, address):
  6. s = socket.socket()
  7. s.connect((host,port))
  8. s.sendall("GET %s HTTP/1.0nHost: %snn" % (address, host))
  9. answer = ""
  10. symbol = s.recv(1024576)
  11. while symbol != '':
  12. answer += symbol
  13. symbol = s.recv(1024576)
  14. s.close()
  15. answer = re.search("rnrn(.+)", answer, re.DOTALL).group(1)
  16. return answer
  17.  
  18. import HTTPClient
  19. import json
  20. import re
  21. import types
  22. import md5
  23. import time
  24.  
  25. class BaseAPIException(Exception):
  26.  
  27. def __init__(self, text=''):
  28. Exception.__init__(self,text)
  29.  
  30.  
  31. class LoginException(BaseAPIException):
  32. pass
  33.  
  34. class MethodExecutionException(BaseAPIException):
  35. pass
  36.  
  37.  
  38. class VKApi:
  39.  
  40. def __init__(self,appId,scope=[],callbackUrl='https://oauth.vk.com/blank.html'):
  41. self.appId = appId
  42. if ( not isinstance(scope,types.ListType)): raise Exception("Wrong args")
  43. scope.append('nohttps')
  44. self.scope = ','.join(scope)
  45. self.callbackUrl=callbackUrl
  46. self.isLoggedIn = False
  47. self.callsCount = 0
  48.  
  49. def getAuthorizeLink(self):
  50. return "https://oauth.vk.com/authorize?client_id=%s&scope=%s&redirect_uri=%s&display=page&v=5.21&response_type=token" %
  51. (self.appId, self.scope, self.callbackUrl)
  52.  
  53. def login(self, link):
  54. tokenRegExp = re.search('access_token=(.*?)(&|$)',link)
  55. if tokenRegExp == None: raise LoginException('No token found')
  56. self.token = tokenRegExp.group(1)
  57. secretRegExp = re.search('secret=(.*?)(&|$)',link)
  58. if secretRegExp == None: raise LoginException('No secret found')
  59. self.secret = secretRegExp.group(1);
  60. self.isLoggedIn = True
  61.  
  62. def loginByToken(self,token,secret):
  63. self.token=token
  64. self.secret=secret
  65. self.isLoggedIn = True
  66.  
  67. def callMethod(self,method,args={}):
  68. if not self.isLoggedIn: raise MethodExecutionException('Not logged in')
  69. if self.callsCount == 3:
  70. time.sleep(1)
  71. self.callsCount = 0
  72. self.callsCount += 1
  73. link = '/method/%s?' % method
  74. link += '&'.join([ '%s=%s' % (k,v) for (k,v) in args.items()])
  75. if len(args)>0: link += '&'
  76. link += 'access_token=%s' % self.token
  77. signature = md5.md5(link + self.secret).hexdigest()
  78. link += '&sig=%s' % signature
  79. try:
  80. response = HTTPClient.get('api.vk.com',80,link)
  81. except Exception as e:
  82. raise MethodExecutionException(e.message)
  83. responseObj = json.loads(response)
  84. if 'error' in responseObj: raise MethodExecutionException(responseObj['error']['error_msg'])
  85. return responseObj['response']
  86.  
  87. import VKApi
  88. import threading
  89.  
  90.  
  91. class VKHandshakeChecker:
  92.  
  93. @property
  94. def answers(self):
  95. return self.__answers
  96.  
  97. @property
  98. def status(self):
  99. return self.__status
  100.  
  101. @property
  102. def currentSequence(self):
  103. return self.__currentSequence
  104.  
  105. def __init__(self,vkapi,maxDepth=6,cache={}):
  106. isinstance(vkapi,VKApi.VKApi)
  107. self.vkapi = vkapi
  108. self.__maxDepth=maxDepth
  109. self.__answers = list()
  110. self.__alreadyBeen = dict()
  111. self.__status = 'IDLE'
  112. self.__canwork = True
  113. self.__cache = cache
  114.  
  115. def startFinding(self,firstId,secondId):
  116. self.__thread = threading.Thread(target=VKHandshakeChecker.__findHandshakes,args=(self,firstId,secondId))
  117. self.__thread.start()
  118.  
  119. def stopFinding(self):
  120. self.__canwork = False
  121.  
  122. def __findHandshakes(self,firstId,secondId):
  123. self.__status = 'WORKING'
  124. self.__answers = list()
  125. for depth in range(2,self.__maxDepth):
  126. self.__currentSequence = [firstId]
  127. self.__findHandshakesRecursive(secondId,depth)
  128. self.__status = 'OK'
  129.  
  130. def __findHandshakesRecursive(self,finalId,depth):
  131. if self.__canwork == False:
  132. return
  133. if len(self.__currentSequence) == depth:
  134. if (self.currentSequence[-1] == finalId):
  135. self.__answers.append(list(self.__currentSequence))
  136. else:
  137. for friendId in self.__getFriends(self.__currentSequence[-1]):
  138. self.__currentSequence.append(friendId)
  139. self.__findHandshakesRecursive(finalId,depth)
  140. self.__currentSequence.pop()
  141. return
  142.  
  143.  
  144. def __getFriends(self,uid):
  145. if uid in self.__cache:
  146. return self.__cache[uid]
  147. try:
  148. response = self.vkapi.callMethod('friends.get',{'user_id':uid})
  149. except:
  150. response = []
  151. self.__cache[uid] = response
  152. return response
  153.  
  154. import VKHandshakeChecker
  155. import VKApi
  156. import socket
  157. import threading
  158. import cPickle as pickle
  159. import sys
  160. import random
  161. import string
  162.  
  163. def handle(sock):
  164. files = sock.makefile('rb+')
  165. request = pickle.load(files)
  166. response = {'header': 'ERROR', 'body':'Non-existent command'}
  167. if request['header'] == 'START':
  168. response = start(request['body'])
  169. elif request['header'] == 'STOP':
  170. response = stop(request['body'])
  171. elif request['header'] == 'GETCURRENTSEQUENCE':
  172. response = getCurrentSequence(request['body'])
  173. elif request['header'] == 'GETANSWERS':
  174. response = getAnswers(request['body'])
  175. elif request['header'] == 'GETSTATUS':
  176. response = getStatus(request['body'])
  177. pickle.dump(response,files)
  178. files.flush()
  179. sock.close()
  180.  
  181. def start(request):
  182. try:
  183. objectId = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(5))
  184. checker = VKHandshakeChecker.VKHandshakeChecker(request['api'], cache=cache)
  185. checker.startFinding(request['firstId'],request['secondId'])
  186. checkers[objectId] = checker
  187. return {'header': 'OK', 'body': {'id': objectId}}
  188. except Exception as e:
  189. return {'header': 'ERROR', 'body': repr(e)}
  190.  
  191. def stop(request):
  192. try:
  193. checkers[request['id']].stopFinding()
  194. del checkers[request['id']]
  195. finally:
  196. return {'header': 'OK', 'body': 'OK'}
  197.  
  198. def getCurrentSequence(request):
  199. try:
  200. checker = checkers[request['id']]
  201. curSeq = checker.currentSequence
  202. return {'header': 'OK', 'body': curSeq}
  203. except Exception, e:
  204. return {'header': 'ERROR', 'body': repr(e)}
  205.  
  206. def getAnswers(request):
  207. try:
  208. checker = checkers[request['id']]
  209. answers = checker.answers
  210. return {'header': 'OK', 'body': answers}
  211. except Exception, e:
  212. return {'header': 'ERROR', 'body': repr(e)}
  213.  
  214. def getStatus(request):
  215. try:
  216. checker = checkers[request['id']]
  217. status = checker.status
  218. return {'header': 'OK', 'body': status}
  219. except Exception, e:
  220. return {'header': 'ERROR', 'body': repr(e)}
  221.  
  222.  
  223. checkers = dict()
  224. cache = dict()
  225. host, port = sys.argv[1:3]
  226. port=int(port)
  227. s = socket.socket()
  228. s.bind((host,port))
  229. s.listen(5)
  230. while True:
  231. conn, addr = s.accept()
  232. threading.Thread(target=handle,args=(conn,)).start()
  233.  
  234. import socket
  235. import cPickle as pickle
  236.  
  237. def sendCommand(server, port, header, body=''):
  238. s = socket.socket()
  239. s.connect((server, int(port)))
  240. request = {'header': header, 'body': body}
  241. files = s.makefile('rb+')
  242. pickle.dump(request,files)
  243. files.flush()
  244. response = pickle.load(files)
  245. if response['header'] == 'ERROR':
  246. raise Exception(response['body'])
  247. return response['body']
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement