[PYTHON] Créez un service Twitter BOT avec GAE / P + Tweepy + RIOT API! (Partie 1)

introduction

En tant que pratique de Google App Engine / Python, nous allons créer un service BOT qui publie automatiquement les résultats du jeu appelé League of Legends sur Twitter. L'authentification Twitter utilise Tweepy qui prend en charge OAuth pour en faire un service que tout le monde peut enregistrer. L'enregistrement du jeu est obtenu à partir de l'API officielle RIOT. Le code source est exploité sur GitBucket, et le produit fini est exploité sur ici.

Bonjour tout le monde de Google App Engine

Les paramètres de l'application GAE / P sont écrits dans le langage yaml. app.yaml est un fichier qui décrit les paramètres de l'ensemble de l'application, comme AndroidManifest.xml sous Android. Décrivez également les paramètres de routage d'URL tels que urls.py dans Django. Étant donné que la version de l'application qui s'exécute réellement sur le serveur peut être facilement changée, si vous augmentez fréquemment la version lors du déploiement, vous n'aurez pas à paniquer en cas de problème.

app.yaml


application: example_app #Nom de l'application
version: 1
runtime: python27 #Python2.Utiliser 7
api_version: 1
threadsafe: true

handlers: #Décrire le routage des URL
- url: /hell
  script: hell.app #hell.Appelez l'application de variable py

Cette fois, nous allons implémenter l'application en Python en utilisant webapp2.

hell.py


#! -*- coding: utf-8 -*-
import webapp2

class hellHandler(webapp2.RequestHandler): #Gestionnaire auquel le traitement est passé
    def get(self): #Traitement de la méthode GET
        self.response.out.write('Hell World!')
    def post(self): #Traitement de la méthode POST
        self.response.out.write('Postes Hell World!')

app = webapp2.WSGIApplication([ ('/hell', hellHandler) ]) #handlers:Appelez le gestionnaire à partir du chemin / de la variable spécifié dans

Allez sur `` http: // example_app.appspot.com / hell '' et vous devriez voir Hell World.

Exécutez Tweepy sur GAE

Pour utiliser Tweepy avec GAE, vous devez préparer votre propre environnement. Tout d'abord, téléchargez le dossier tweepy entier depuis GitHub et placez-le dans votre dossier de projet. Ensuite, puisque Tweepy utilise ssl, ajoutez la bibliothèque à utiliser dans app.yaml. Spécifiez également l'adresse de rappel et forcez la communication HTTPS pour assurer la sécurité.

app.yaml


application: example_app
version: 1
runtime: python27
api_version: 1
threadsafe: true

libraries: #Spécifiez la bibliothèque à utiliser
- name: ssl
  version: latest

handlers:
- url: /
  script: main.app
  
- url: /callback #Adresse de rappel
  script: main.app
  secure: always #Forcer la communication HTTPS

Ensuite, implémentons une application de test qui permet à l'utilisateur d'effectuer l'authentification OAuth et stocke la clé de jeton d'accès et la clé de jeton secret d'accès dans le magasin de données (base de données GAE). La conception du magasin de données est différente de celle d'un SGBDR général, mais comme il a un mappeur O / R de type Django, il n'a pas beaucoup de mal à utiliser le modèle d'une manière ou d'une autre.

main.py


#! -*- coding: utf-8 -*-
from google.appengine.ext import db

import webapp2, tweepy

#Clé client Twitter
CONSUMER_KEY = '********************'
CONSUMER_SECRET = '**************************************'

class modelUser(db.Model): #Définition de modèle pour stocker les informations de compte Twitter
    twitter_name = db.StringProperty()
    access_key = db.StringProperty()
    access_secret = db.StringProperty()
    date = db.DateTimeProperty(auto_now_add=True)

class mainHandler(webapp2.RequestHandler):
    def get(self):
        #Bouton de démarrage de l'authentification de sortie
        self.response.out.write('<form method="POST" action="./"><button type="submit">Authentification</button></form>')
    def post(self):
        #Définir la clé du consommateur sur Tweepy
        auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
        try:
            redirect_url = auth.get_authorization_url() #Obtenir l'URL pour l'authentification OAuth
            self.redirect(redirect_url) #Redirection vers l'URL pour l'authentification OAuth
        except Exception as e:
            self.response.out.write('Ella')

class callbackHandler(webapp2.RequestHandler):
    def get(self):
        auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
        try:
            #Laissez Tweepy authentifier divers paramètres reçus
            auth.set_request_token(self.request.get('oauth_token'), self.request.get('oauth_verifier'))
            auth.get_access_token(self.request.get('oauth_verifier'))
            access_key = auth.access_token.key
            access_secret = auth.access_token.secret
            auth.set_access_token(access_key, access_secret)
            api = tweepy.API(auth) #Après cela, diverses informations peuvent être obtenues à partir de cet objet.
            
            modeluser = modelUser().get_or_insert(str(api.me().id)) #Définir la clé de modèle sur l'ID interne Twitter
            modeluser.twitter_name = api.me().screen_name #Twitter Id
            modeluser.access_key = access_key #Clé de jeton d'accès
            modeluser.access_secret = access_secret #Accéder à la clé de jeton secrète
            modeluser.put() #Reflété dans la base de données

            self.response.out.write('Achèvement de l'inscription')
        except Exception as e:
            self.response.out.write('Ella')

app = webapp2.WSGIApplication([ ('/', mainHandler), ('/callback', callbackHandler) ])

Le magasin de données a un attribut appelé clé, et il est pratique de définir la clé en utilisant get_or_insert ('unique value') '' lors de la création d'une entrée avec une valeur unique. De plus, la clé avec une valeur unique est récupérée avec key (). Name () '', et si aucune clé n'est spécifiée, un ID aléatoire est automatiquement attribué et key (). Obtenez l'ID avec id ().

RIOT API

Pour utiliser l'API RIOT, connectez-vous d'abord au Site des développeurs avec votre compte LoL. La limite du nombre de requêtes API y est spécifiée comme indiqué ci-dessous (à partir de février 2014).

―― 10 requêtes / 10 secondes --500 requêtes / 10 minutes

En d'autres termes, si l'intervalle de demande tombe en dessous de 1,2 seconde en moyenne, vous courez le risque d'être soumis à des limites de demande. Le temps le plus court pour un jeu de LoL est de 20 minutes qui peuvent être abandonnées (bien que cela puisse être plus rapide), et en théorie, 1000 utilisateurs sont le maximum pour orbiter le BOT sans délai. C'est assez.

Ensuite, utilisons réellement / api / lol / {region} /v1.3/summoner/by-name/ {summonerNames} pour obtenir les informations d'invocateur. Vous pouvez vérifier l'opération en entrant le nom de l'invocateur sur la page API sur le site des développeurs. Les données extraites de l'API sont renvoyées au format JSON. Cette fois, nous utiliserons le simplejson de django pour analyser le JSON, donc spécifiez d'abord django dans la bibliothèque.

app.yaml


application: example_app
version: 7
runtime: python27
api_version: 1
threadsafe: true

libraries:
- name: django
  version: "1.4" #Spécifiez la version que vous connaissez

handlers:
- url: /registration
  script: main.app
  secure: always

Implémentez une application Web en Python qui renvoie un ID d'invocateur lorsque l'utilisateur entre un nom d'invocateur.

main.py


#! -*- coding: utf-8 -*-
from google.appengine.api.urlfetch import fetch
from django.utils.simplejson import loads

import webapp2
from urllib import quote
from time import mktime
from cgi import escape

from datetime import datetime

RIOT_KEY = '***********************************'

def getId(resion, summoner_name): #Fonction d'acquisition d'identifiant d'invocateur
    #Obtenir des informations sur l'invocateur de l'API
    result = fetch('https://prod.api.pvp.net/api/lol/'+resion+'/v1.3/summoner/by-name/'+quote(summoner_name)+'?api_key='+RIOT_KEY)
    if result.status_code == 200:
        #Passer à l'analyseur JSON et renvoyer l'ID et le nom
        j = loads(result.content)[summoner_name.lower().replace(' ', '')]
        return j['id'], j['name']
    else:
        return -1, None

class registrationHandler(webapp2.RequestHandler):
    def get(self):
        #Bouton de démarrage de l'acquisition de sortie
        self.response.out.write('<form method="POST" action="./registration"><input type="radio" name="resion" value="1" checked="checked" />NA<input type="radio" name="resion" value="2" />EUW<input type="radio" name="resion" value="3" />EUNE<input type="text" name="summoner_name" /><button type="submit">Avoir</button></form>')
    def post(self):
        try:
            #Obtenez le nom et la région saisis
            summoner_name = escape(self.request.get('summoner_name'))
            if escape(self.request.get('resion')) == '1':
                resion = 'na'
            elif escape(self.request.get('resion')) == '2':
                resion = 'euw'
            elif escape(self.request.get('resion')) == '3':
                resion = 'eune'

            #Appelez la fonction d'acquisition d'identifiant d'invocateur
            summoner_id, summoner_name = getId(resion, summoner_name)

            #Sortir le résultat
            if summoner_id > 0:
                self.response.out.write('ID d'invocateur:'+summoner_id+'Nom d'invocateur:'+summoner_name)
            else:
                self.response.out.write('Il n'y a pas d'invocateur, mais c'est')
                return

        except Exception as e:
            self.response.out.write('Ella')

app = webapp2.WSGIApplication([ ('/registration', registrationHandler) ])

Aperçu de la prochaine fois

Ça va être long, je vais donc terminer la première partie ici. Dans la deuxième partie, je voudrais aborder la façon de transformer réellement le BOT en utilisant Queue, Backend, Cron et Memchache. → Partie 2 Je l'ai écrit!

Recommended Posts

Créez un service Twitter BOT avec GAE / P + Tweepy + RIOT API! (Partie 1)
Créez un service Twitter BOT avec GAE / P + Tweepy + RIOT API! (Partie 2)
Étapes pour créer un bot Twitter avec Python
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
Créez un robot de réponse automatique en temps réel à l'aide de l'API Twitter Streaming
Créez un Twitter BOT avec le SDK GoogleAppEngine pour Python
J'ai créé un bot Twitter avec Go x Qiita API x Lambda
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
Créez un bot qui stimule les tendances Twitter
Créer un service Web avec Docker + Flask
Faisons un bot Twitter avec Python!
Tweet les prévisions météo avec le bot Partie 2
Créer un bot Twitter Trend avec heroku + Python
Créer un LINE BOT avec Minette pour Python
[Life hack] Bot de support Anna pour femmes avec API Twitter
Créez une carte thermique de tweet avec l'API Google Maps
[LINE Messaging API] Créer un BOT de retour de perroquet avec Python
Créer un bot slack
J'ai écrit un script pour créer rapidement un environnement de développement pour Twitter Bot avec AWS Lambda + Python 2.7
Créez une application d'apprentissage automatique avec ABEJA Platform + LINE Bot
Créez un bot Mastodon avec une fonction pour répondre automatiquement avec Python
Tornado - Créons une API Web qui renvoie facilement JSON avec JSON
Créez une API Web capable de fournir des images avec Django
Créez une API d'intégration sociale pour les applications smartphone avec Django
Créer une API avec Django
Utiliser l'API Twitter avec Python
Créer une page d'accueil avec django
Soutenez-vous avec l'API Twitter
Créer un répertoire avec python
Update_with_media réussi avec l'API Twitter
[AWS Hands-on] Créons un service d'identification des célébrités avec une architecture sans serveur!
Créez un nuage de mots avec uniquement des mots positifs / négatifs sur Twitter
Essayez de créer un article de Qiita avec l'API REST [Préparation environnementale]
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
Comment créer une API de machine learning sans serveur avec AWS Lambda
Les débutants créeront un bot de trading automatique Bitcoin visant beaucoup d'argent! Partie 2 [Transaction avec API]