2017-06-13

Pynder PythonでTinderのAPIをいじる

PythonでTinderのAPIを利用する



TinderにはAPIがあるそうなので、さっそく利用してみた。
PythonはCloud9というクラウドで環境構築してある。

TinderのAPIを使うために必要なのはFacebookのアクセストークンと、Pynderというモジュール。


Pynderを準備


pythonでapiをいじるためのpynderをinstall


$ sudo pip install pynder


インストールされたみたい。

インストールされたか確認


$ python -m pip freeze


はいってるみたい
pynder==0.0.13

apiいじるコードをgithubからコピペする
https://github.com/charliewolf/pynder


import pynder
session = pynder.Session(facebook_id, facebook_auth_token)
session.matches() # get users you have already been matched with
session.update_location(LAT, LON) # updates latitude and longitude for your profile
session.profile  # your profile. If you update its attributes they will be updated on Tinder.
users = session.nearby_users() # returns a iterable of users nearby

で、facebook idとaccess tokenをぶち込む。で、実行


$ python ex50/bin/test.py


でもエラーがでる

TypeError: request() got an unexpected keyword argument 'json'


requestsがないからupdateしてみる

$ sudo pip3 install --upgrade requests

うまくいったらしい。
Successfully installed requests chardet idna urllib3 certifi


うまくいったらしい。もう一度実行


$ python ex50/bin/test.py


エラーを吐いた。
pynder.errors.RequestError: 401


ぐぐったら、どうもfacebookidはいらないみたい
https://github.com/charliewolf/pynder/issues/133


だから消してFacebook access tokenだけにしてみた。で、実行

$ python ex50/bin/test.py

pynder.errors.RequestError: Couldn't authenticate

Facebookアクセストークンで承認できないらしい。アクセストークンが違うんだろう。


またググる
https://github.com/charliewolf/pynder/issues/28

Sanity check: Can you try generating a token using the method outlined here?
https://gist.github.com/rtt/10403467


ふむ、
調べたらtinder apiを利用する際にアクセストークンを入れる方法があるらしい。

----------翌日---------------

あ、そうだ、すでにtinderのprivate apiを利用しているサイトがあったよな。
それにアクセストークンを利用するって書いてあったから、その方法で試してみよう。

このサイトに、アクセストークンの取得の仕方が書いてある。
https://tinderface.herokuapp.com/

Step 1
Click the button below to open the auth dialog and login to Facebook if you are not already.
Step 2
You will see a dialog that says you have already authorized Tinder.
At this point, open your browser’s developer tools. (Cmd + Option + I on Mac) or (F12, Ctrl + Shift + I on Windows) or right click the page anywhere and select 'Inspect'.
Switch to the 'Network' tab in your developer tools window. Your dev tools window should look like the image below.
Step 3
Press the 'Okay' button on the Tinder dialog, and you will see some activity in the Network tab.
In the Network tab, locate the new 'confirm?dpr=2' entry, and right click it.
Select the 'Copy Response' option from the context menu like in the image below.
Step 4
After copying the response, paste it into the text field below, press the 'Submit' button, and your FB access token will be parsed from the response. We will then fetch your Tinder auth token and log you in to Tinder.
Paste Facebook Auth Response

なるほど、TinderにFacebook認証するページで、Inspectorを起動して、Networkタグを開くと。で、そこで'confirm?dpr=2' という値の中に、アクセストークンが入っているらしい。You have already authorizedと出てきたときに、Inspectorを切れるのね。




おお、あった。


for (;;);{"__ar":1,"__sf":"iw","payload":null,"jsmods":{"require":[["ServerRedirect","redirectPageTo",[],["fb464891386855067:\/\/authorize\/#signed_request=[ここにアクセストークンがありました]&expires_in=6415",true,false],[]]]},"js":["kzs9X"],"bootloadable":{},"resource_map":{"kzs9X":{"type":"js","src":"https:\/\/www.facebook.com\/rsrc.php\/v3i-F-4\/yz\/l\/en_US\/oS3FMOV7Adn.js","crossOrigin":1}},"ixData":{},"lid":"6430893981742660939"}



これをそのサイトのフォームにぶち込んで、その後ログアウトして、もう一度ぶち込んだフォームを見ると、さきほどjson形式で取得したデータのうち、facebook access tokenだけが保存されているみたいだ。



で、このコードのSigned Request以降を利用してみようか。これをアクセストークンにするとどうなるんだろう。で、さっきのコードに今出てきたアクセストークンをぶち込んで、実行してみよう。


$ python ex50/bin/test.py


お、成功したっぽい。とりあえず認証はできたようだ。今度は認証後にデータを取得できるかためしてみよう。


Traceback (most recent call last):
  File "ex50/bin/test.py", line 5, in <module>
    session.update_location(LAT, LON) # updates latitude and longitude for your profile
NameError: name 'LAT' is not defined



今のところ、LAT、LONという緯度経度情報を入れてないからだめらしい。
逆に言えば、LATとLONを定義すれば、好きな場所で人を集めることができるわけだ。
しかもここ、手打ちでいいんだね。

https://user.numazu-ct.ac.jp/~tsato/webmap/sphere/coordinates/advanced.html


いったん、ソースコードを消してみよう。

import pynder

session = pynder.Session("[ここに僕のfacebookアクセストークンが入ってます。]")
session.matches() # get users you have already been matched with
users = session.nearby_users() # returns a list of users nearby
users[1]


しかしうまくいかない
TypeError: 'generator' object is not subscriptable

じゃああれだ、nearbyを使ってみようか。

どちらにしても
TypeError: 'generator' object is not subscriptable

が出てくる。これなんだ。


pynder TypeError: 'generator' object is not subscriptableで検索





どうもgeneratorオブジェクトというらしい。user[1]みたいに数字で取り出せないらしい。
Pythonで良く見かける「unsusbscriptable object」エラーとは…
subscript という英単語を辞書で引くと
プログラムで配列要素を指定するために用いられる記号《集合の要素につける番号》
という意味がありました.
あるオブジェクトをlistオブジェクトとみなして”[]”演算子(?)を使って要素を取出そうとした.だけど,あるオブジェクトはlistオブジェクトじゃないのでTypeErrorになる.つまり,Pythonの unsubscriptable object は「番号によって要素指定できないオブジェクトだよ」という意味ですね.

------0935-------------------------

山手線でtinder apiをいじる

どうも数字しているとダメなオブジェクトみたいだったので、forで回してみる。

users = session.nearby_users() # returns a list of users nearby
for user in users:
print(user.name)
print(user.schools)

そしたら、いっぱい出てきたwwwやったーぬきとったぞ!

純ジャパです🇯🇵
✩Super Like待ってます✩
XXXX

XXXX
Hi I'm XXXX😊I'm a cheer girl👯
like snowboading/singing/sports
live in Tokyo/20yo
ちありーだーやってます👯
運動と食べることとアメフト観戦が好きです!
152cmのちびです。
ゆるーく絡んでいただけると嬉しいです☺️
Instagram:XXXXXXX
XXXXXX
社会人です。
邦ロック、ライブに行くのが趣味です〜
関西出身 お酒飲まない煙草吸わないギャンブルしないウェイ系苦手ピアス開けない髪染めたことない
XXXXXXX
はじめたばかりで、良く分からないのですが仲良くしてください。
今年の四月に社会人になりたて。
仕事やめたくて仕方ないですが頑張ってます…!笑笑
マンガ、アニメ、甘いもの、大好きです。笑

普通に仲良くなれる方とも知り合えたらいいなあ(*´-`)
XXXXXXXX
XXXXXXXX
XXXXXXXX好きなもの、公園、海、茄子とトマトを育てる、大型犬
ふつうくらいの顔。
XXXXXXXX
XXXXXXXX

XXXXXXは名前を隠してます。


一応、Tinder APIを利用して、現在の位置情報から近くのユーザーをPythonで取得することに成功!やったね!

注目の投稿

 PythonのTweepyを利用して、Twitter APIを利用している。 その中で、ハマったポイントをメモしておく。 まず、Searchに関して。 Twitter検索は、クライアントアプリ側では、全期間の検索が可能になっている。 一方で、APIを利用する際は、過去1週間しか...