Twitter의 Account Activity API를 사용하기 위해 한 일

소개



트위터의 Account Activity API를 사용하기 위해 한 일을 작성합니다.
조금 시간이 지나서 쓰고 있기 때문에 잊거나 틀린 곳이 있을지도 모릅니다.

환경



Debian9
apache2.4
python3.5

애플리케이션 작성



여기에서 만들자.
권한은 Read, write, and direct messages여야 합니다.


액세스를 위한 신청 및 환경 이름 설정



여기에서 신청합시다.
이 API를 사용하여 무엇을 하는지 300자 이상의 영문으로 설명해야 합니다.
안전하게 신청하면 트위터에서 이메일을 받게 됩니다.

Dev Environments 페이지에서 환경 이름을 설정합시다. 이 환경 이름은 Webhook URL을 등록할 때 사용합니다.


서버 준비



원하는 방식으로 서버를 준비합시다. 저자는 ConoHa의 VPS를 사용했습니다.
다음 명령을 실행하여 필요한 것을 정렬합니다.
sudo apt update
sudo apt upgrade

sudo apt install python3 python3-pip
sudo pip3 install requests requests_oauthlib flask

sudo apt install apache2 libapache2-mod-wsgi-py3
sudo apt install certbot python-certbot-apache

도메인 준비



원하는 방식으로 도메인을 준비하세요. 필자는 이름.com에서 "6~9자리 숫자.xyz"의 염가 도메인을 취득했습니다.
DNS 레코드 설정도 잊지 마세요.

웹 서버 준비



apache의 기본 설정은 완료되었다고 가정합니다.

/etc/apache/envvars 의 LANG=C 가 있는 곳을 LANG=en_US.UTF-8 또는 LANG=ko_JP.UTF-8 로 변경합시다.

그런 다음 certbot에서 HTTPS로 만듭니다.
다음의 커멘드를 실행해 순서대로 작업하면 HTTPS화할 수 있을 것입니다만・・・
sudo certbot --apache

이런 오류가 발생합니다.

"Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA."

TLS-SNI 검증을 무효화했기 때문이라고 합니다만, 솔직히 잘 모르겠습니다.
대신 다음 명령으로 HTTPS화할 수 있습니다.
sudo certbot --authenticator webroot -w <path> -d <domain> --installer apache

문서 루트가/var/www/html이고 도메인이 hogehoge.com인 경우 이런 식입니다.
sudo certbot --authenticator webroot -w /var/www/html -d hogehoge.com --installer apache

그런 다음 권장 서버 구성을 위해/etc/letsencrypt/options-ssl-apache.conf의 일부를 다음과 같이 변경합니다.
SSLProtocol             all -SSLv2 -SSLv3 -TLSV1
SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:DES-CBC3-SHA
SSLHonorCipherOrder     on
SSLCompression          off

설정을 반영합시다.
sudo systemctl restart apache2

이것으로 HTTPS화가 완료되었습니다.

wsgi를 사용할 수 있도록



Python3 & Flask를 사용하기 때문입니다.
다음 명령으로 활성화합시다.
sudo a2enmod wsgi
sudo systemctl reload apache2

그런 다음 apache 설정 파일을 만듭니다.
프로그램을/home/user/twitter 아래에 두는 경우, 이와 같이 됩니다.

/etc/apache2/conf-available/twitter.conf
<Directory "/home/user/twitter">
    Require all granted
</Directory>

WSGIPythonPath /home/user/twitter
WSGIScriptAlias / /home/user/twitter/app.py

여기도 활성화합시다.
sudo a2enconf twitter
sudo systemctl reload apache2

CRC에 대한 응답



Webhook URL 등록시 CRC가 전송되므로 먼저 CRC에 응답하는 프로그램을 만들어 둡니다.

/home/user/twitter/app.py
from flask import Flask, request
import base64
import hashlib
import hmac
import json

application = Flask("application-name")
consumer_secret = 'xxxxx'

@application.route('/webhooks/twitter', methods = ['GET'])
def get():
    if 'crc_token' in request.args and len(request.args.get('crc_token')) == 48:
        crc_token = request.args.get('crc_token')
        sha256_hash_digest = hmac.new(consumer_secret.encode(), msg = crc_token.encode(), digestmod = hashlib.sha256).digest()

        response_token = 'sha256=' + base64.b64encode(sha256_hash_digest).decode()
        response = {'response_token': response_token}

        return json.dumps(response), 200, {'Content-Type': 'application/json'}

    return 'No Content', 204, {'Content-Type': 'text/plain'}

이것을 저장하고 적절한 권한을 부여하십시오.
sudo chmod 755 /home/user/twitter/app.py

만약을 위해 apache의 재기동도 해보자.
sudo systemctl restart apache2

Webhook URL 등록 및 Webhook에서 이벤트를 수신하는 애플리케이션 추가



등록하는 URL은 CRC에 대한 응답으로 만든 프로그램의 다음 부분에서 결정됩니다.
@application.route('/webhooks/twitter', method = [GET])

이것은 트위터 가이드와 마찬가지로 만들었습니다.
이 경우 URL은 htps : // 허벅지. 코 m / ぇ b 호오 ks /와 r입니다.

그럼 파이썬 3의 대화 모드에서 갑니다.
consumer_key, consumer_secret, access_token, access_token_secret에는 작성한 어플리케이션의 것을 넣어 주세요.
url의 :env_name 부분은 환경명의 설정으로 설정한 것을 넣어 주세요.
>>> from requests_oauthlib import OAuth1Sesstion
>>> twitter = OAuth1Sesstion(consumer_key, consumer_secret, access_token, access_token_secret)
>>>
>>> url = 'https://api.twitter.com/1.1/account_activity/all/:env_name/webhooks.json'
>>> response = twitter.post(url, params = {'url': 'https://hogehoge.com/webhooks/twitter'})
>>> # 成功すれば response == <Response [200]>
>>> # response.textでwebhook_idが確認できる
>>>
>>> url = 'https://api.twitter.com/1.1/account_activity/all/:env_name/subscriptions.json'
>>> response = twitter.post(url)
>>> # 成功すれば response == <Response [204]>

수고하셨습니다.



이제 마침내 Account Activity API를 사용할 수 있습니다.

좋은 웹페이지 즐겨찾기