python tinder bot不会发送消息 - 网络错误

时间:2016-02-27 02:19:56

标签: python

我正在组装一个自动滑动的python Tinder机器人,我也想让它发送消息。一切正常,除非它匹配时,它应该发送消息,但不是。我已经尝试了我能想到的所有可能的代码组合,但无济于事。任何有关解决这个问题的帮助都会让我和我未来的Tinder比赛(如果我得到任何比赛)非常感激。

代码调用一个名为talk(user_id)的funtcion,它应该执行POST curl请求。

代码:

1,1  Top# encoding: utf8
import argparse
from datetime import datetime
import json
from random import randint
import requests
import sys
from time import sleep


headers = {
    'app_version': '519',
    'platform': 'ios',
}


fb_id = 'XXXXXXXXXXXXX'
fb_auth_token = 'XXXXXXXXXXXX'


class User(object):
    def __init__(self, data_dict):
        self.d = data_dict

    @property
    def user_id(self):
        return self.d['_id']

    @property
    def name(self):
        return self.d['name']

    @property
    def ago(self):
        raw = self.d.get('ping_time')
        if raw:
            d = datetime.strptime(raw, '%Y-%m-%dT%H:%M:%S.%fZ')
            secs_ago = int(datetime.now().strftime("%s")) - int(d.strftime("%s"))
            if secs_ago > 86400:
                return u'{days} days ago'.format(days=secs_ago / 86400)
            elif secs_ago < 3600:
                return u'{mins} mins ago'.format(mins=secs_ago / 60)
            else:
                return u'{hours} hours ago'.format(hours=secs_ago / 3600)

        return '[unknown]'

    @property
    def bio(self):
       try:
           x = self.d['bio'].encode('ascii', 'ignore').replace('\n', '')[:50].strip()
        except (UnicodeError, UnicodeEncodeError, UnicodeDecodeError):
             return '[garbled]'
        else:
            return x

    @property
    def age(self):
        raw = self.d.get('birth_date')
        if raw:
            d = datetime.strptime(raw, '%Y-%m-%dT%H:%M:%S.%fZ')
            return datetime.now().year - int(d.strftime('%Y'))

        return 0

    def __unicode__(self):
        return u'{name} ({age}), {distance}km, {ago}'.format(
            name=self.d['name'],
            age=self.age,
            distance=self.d['distance_mi'],
            ago=self.ago
        )

def auth_token(fb_auth_token, fb_user_id):
    h = headers
    h.update({'content-type': 'application/json'})
    req = requests.post(
        'https://api.gotinder.com/auth',
        headers=h,
        data=json.dumps({'facebook_token': fb_auth_token, 'facebook_id':          fb_user_id})
    )
    try:
        return req.json()['token']
    except:
        return None


def recommendations(auth_token):
    h = headers
    h.update({'X-Auth-Token': auth_token})
    r = requests.get('https://api.gotinder.com/user/recs', headers=h)
    if r.status_code == 401 or r.status_code == 504:
        raise Exception('Invalid code')
        print r.content

    if not 'results' in r.json():
        print r.json()

    for result in r.json()['results']:
        yield User(result)


def like(user_id):
    try:
        u = 'https://api.gotinder.com/like/%s' % user_id
        d = requests.get(u, headers=headers, timeout=0.7).json()
    except KeyError:
        raise
    else:
        return d['match']


def nope(user_id):
    try:
        u = 'https://api.gotinder.com/pass/%s' % user_id
        requests.get(u, headers=headers, timeout=0.7).json()
    except KeyError:
        raise

def like_or_nope():
    return 'nope' if randint(1, 100) == 31 else 'like'


def talk(user_id):
    try:
        u = 'https://api.gotinder.com/user/matches/%s' % user_id
        requests.post(
        u,
        data=json.dumps=({'message': 'Hey! How are you?'})
        )
    except KeyError:
        raise


if __name__ == '__main__':

    parser = argparse.ArgumentParser(description='Tinder automated bot')
    parser.add_argument('-l', '--log', type=str, default='activity.log',     help='Log file destination')

    args = parser.parse_args()

    print 'Tinder bot'
    print '----------'
    matches = 0
    liked = 0
    nopes = 0

    while True:
        token = auth_token(fb_auth_token, fb_id)

        if not token:
            print 'could not get token'
            sys.exit(0)

        for user in recommendations(token):
            if not user:
                break

            print unicode(user)

            if user.name == 'Tinder Team':
                print('Out of swipes, pausing one hour...')
                sleep(3601)

            else:
                try:
                    action = like_or_nope()
                    if action == 'like':
                        print ' -> Like'
                        match = like(user.user_id)
                        if match:
                            print ' -> Match!'
                            conversation = talk(user.user_id)
                            if conversation:
                                print ' -> Message Sent!'

                            with open('./matched.txt', 'a') as m:
                                m.write(user.user_id + u'\n')

                        with open('./liked.txt', 'a') as f:
                            f.write(user.user_id + u'\n')

                    else:
                        print ' -> random nope :('
                        nope(user.user_id)
                except:
                    print 'networking error %s' % user.user_id

            s = float(randint(10000, 20000) / 1000)
            sleep(s)`

1 个答案:

答案 0 :(得分:1)

检查以下代码是否有帮助。我使用pynder包来解析API,但我猜逻辑仍然是一样的。

session._post('/user/matches/' + match['id'], {"message": "Hey! How are you?"})

帖子功能如下所示: -

def _post(self, url, data={}):
        return self._request("post", url, data=data)

直接尝试此方法data = {message}  它对我有用,非常好。