9
9

More than 5 years have passed since last update.

Djangoを使ってツイートデータをガンガン保存していく

Last updated at Posted at 2016-10-25

Djangoでツイッターのツイートデータをガシガシ保存するやつ

前回作ったクライアントにツイートデータを保存する機能をくっつけてみました。やり方としては全然smartでは無いんですが、うまく動いたということで報告も兼ねまして。

前回>http://qiita.com/Gen6/items/11fa5265053da95fcf0b

準備

mysite/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

models.pyを書いていく

Djangoでずっと躓いていた(去年)箇所がこのmodels.pyとかいうものになります。実際何をやっているのかがよくわからなかったのですが、いわゆるデータベースのテーブルを定義しているようなものですね。

myapp/models.py
from django.db import models


class Supermodel(models.Model):
    user_name = models.CharField(max_length=140)
    user_id = models.CharField(max_length=140)
    user_img = models.CharField(max_length=140)
    user_text = models.TextField(null=True)
    user_created_at = models.CharField(max_length=140)

    def __str__(self):
        return self.user_name

ツイートデータから、ユーザー名・ID・サムネイル・テキスト本体・日時を保存したいのでこのような書き方になります。Supermodelとかいう名前はどうかとも思ったのですが、書いてしまったので仕方ないです。

admin.pyを書いていく

Djangoの管理画面からも実際に動いているかを確認したかったのでコチラも書いていきます。

myapp/admin.py
from django.contrib import admin
from myapp.models import Supermodel


class SupermodelAdmin(admin.ModelAdmin):
    list_display = ('id','user_id','user_name','user_img','user_text','user_created_at')

admin.site.register(Supermodel,SupermodelAdmin)

migrateする

$ python manage.py makemigrations myapp
$ python manage.py migrate

成功すれば次へ進めます。
正直ここはまだ完全にはよく分かってないので他の人の記述を読んでいただいたほうが良いかと思います。

views.pyを編集する

myapp/views.py

from requests_oauthlib import OAuth1Session
import time, calendar
import datetime
import json
import re
import os
import requests
import sys, codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

from django.http.response import HttpResponse
from django.shortcuts import render
from myapp.models import Supermodel


def index(request):

    msg = request.GET.get('words')

    C_KEY = '**************************'
    C_SECRET = '**************************'
    A_KEY = '**************************'
    A_SECRET = '**************************'

    url = 'https://api.twitter.com/1.1/statuses/update.json'
    params = {'status': msg,'lang': 'ja'}
    tw = OAuth1Session(C_KEY,C_SECRET,A_KEY,A_SECRET)
    req = tw.post(url, params = params)


    url = 'https://api.twitter.com/1.1/statuses/home_timeline.json'
    params = {'count': 1}
    req = tw.get(url, params = params)

    if req.status_code == 200:
        timeline = json.loads(req.text)
        limit = req.headers['x-rate-limit-remaining']

        for tweet in timeline:
            Text = (tweet['text'])
            User = (tweet['user']['screen_name'])
            Name = (tweet['user']['name'])
            Img = (tweet['user']['profile_image_url'])
            Created_at = YmdHMS(tweet['created_at'])

            data = Supermodel()
            data.user_id = User
            data.user_name = Name
            data.user_img = Img
            data.user_text = Text
            data.user_created_at = Created_at
            data.save()

            Message = {
                'Words': msg,
                'timeline': timeline,
                'API_limit': limit,
                'Text': Text,
                'User': User,
                'Name': Name,
                'Img': Img,
                'Created_at': Created_at,
            }

            return render(request, 'index.html', Message)

    else:
        Error = {
            'Error_message': 'API制限中',
        }
        return render(request, 'index.html', Error)


def YmdHMS(created_at):
    time_utc = time.strptime(created_at, '%a %b %d %H:%M:%S +0000 %Y')
    unix_time = calendar.timegm(time_utc)
    time_local = time.localtime(unix_time)
    return int(time.strftime('%Y%m%d%H%M%S', time_local))

くっそ汚いコードでスイマセンが、これで完了。

スクリーンショット-2016-10-25-17.17.jpg

localhost/admin で確認できます。
すごく簡単ですね。実は。

検索APIの方を使えば検索結果をものの見事にデータベースへ取り込むことも可能です。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9