【メモ】pythonでtwitterにつぶやく


Python2.7とpython-twitterで適当にtwitterへつぶやいてみた
場合によってはoauth2もインストールしないといけないかも

準備として```pip install twitter oauth2```とかで適当にライブラリを組み込む

クライアントの情報を開発者ページで取得して

なくても平気ですが設定用のxmlを作ります

こんな感じ

###設定ファイル

```xml:config.xml
<?xml version="1.0" ?>
<config>
    <consumer_key>TwitterクライアントのConsumerKey</consumer_key>
    <consumer_secret>TwitterクライアントのConsumer_SecretKey</consumer_secret>
</config>

```

認証するためのスクリプトを書きます
前段階でxml作らない場合は初回起動時に聞いてきます
エラー吐いたらライブラリが足りないかxmlがおかしくなってるので消すか書き直してください

###Oauth認証ファイル

```py:oauthing.py
import oauth2,urlparse
import webbrowser
import os
import xml.etree.ElementTree as XML
from xml.dom import minidom


#パーサー
def pretty(elem):
    rough_string = XML.tostring(elem,'utf-8')
    reparsed = minidom.parseString(rough_string)
    return reparsed.toprettyxml(indent='    ')

#格納先
CONSUMER_KEY        = ''
CONSUMER_SECLET     = ''

#　読み込むコンフィグファイル名
CONFIG_FILE = 'config.xml'

#存在チェック
if os.path.isfile(CONFIG_FILE):
    # read consumerkey as config.xml
    tree = XML.parse(CONFIG_FILE)
    root = tree.getroot()
    CONSUMER_KEY = root.find('.//consumer_key').text
    CONSUMER_SECLET = root.find('.//consumer_secret').text

else:
    # read input as write file
   top = XML.Element('config')
   con_key = XML.SubElement(top,'consumer_key')
   print 'request Consumer Key ? '
   con_key.text = raw_input()
   CONSUMER_KEY = con_key.text
   con_secret = XML.SubElement(top,'consumer_secret')
   print 'request Consumer Secret Key ? '
   con_secret.text = raw_input()
   CONSUMER_SECLET = con_secret.text
   with open(CONFIG_FILE,'w') as f:
       f.write(pretty(top))

consumer = oauth2.Consumer(key='{0}'.format(CONSUMER_KEY),secret='{0}'.format(CONSUMER_SECLET))
client = oauth2.Client(consumer)

resp,content = client.request('https://api.twitter.com/oauth/request_token','GET')

d = dict(urlparse.parse_qsl(content) )

url ='https://api.twitter.com/oauth/authorize?oauth_token={0}'.format(d['oauth_token'])
webbrowser.open(url)

#ここでブラウザでPIN認証を行う
print 'request pin'
pin = raw_input()

token =  oauth2.Token(d['oauth_token'],d['oauth_token_secret'] )
client = oauth2.Client(consumer,token)
resp,content = client.request('https://api.twitter.com/oauth/access_token',
        'POST',
        body='oauth_verifier={0}'.format(pin)
        )

d2 = dict(urlparse.parse_qsl(content) )

#うまく認証できていればここでユーザー情報の書き出し
newroot = XML.Element('config')
tree = XML.parse(CONFIG_FILE)
root = tree.getroot()
CONSUMER_KEY = root.find('.//consumer_key').text
CONSUMER_SECLET = root.find('.//consumer_secret').text
con_key = XML.SubElement(newroot,'consumer_key');
con_key.text = CONSUMER_KEY
con_secret = XML.SubElement(newroot,'consumer_secret')
con_secret.text = CONSUMER_SECLET
oauth = XML.SubElement(newroot,'oauth_token')
oauth.text = d2['oauth_token']
oauth_secret = XML.SubElement( newroot ,'oauth_token_secret')
oauth_secret.text = d2['oauth_token_secret']

with open(CONFIG_FILE,'w') as f:
   f.write(pretty(newroot))

```


つぶやくアカウントと使うクライアントの開発アカウントが同じなら
oauthing.py無視してXML書いてしまえます

```xml:config.xml
<?xml version="1.0" ?>
<config>
    <consumer_key>TwitterクライアントのConsumerKey</consumer_key>
    <consumer_secret>TwitterクライアントのConsumer_SecretKey</consumer_secret>
    <oauth_token>Twitterクライアントのoauth_Token</oauth_token>
    <oauth_token_secret>TwitterクライアントのOauth_Token_SecretKey</oauth_token_secret>
</config>

```

認証できれば後はこっちだけで十分です

###実際につぶやくファイル

```py:tweet.py
import twitter
import commands
import os
import platform
import urllib
import xml.etree.ElementTree as XML

def check_None(elem,key):
    res = None
    res = elem.find(key)
    if res == None:
        res = ''
    else:
        res = res.text
    return res


CONFIG_FILE = 'config.xml'

CONSUMER_KEY        = ''
CONSUMER_SECLET     = ''
ACCESS_TOKEN_KEY    = ''
ACCESS_TOKEN_SECLET = ''

#oauthing.pyで作ったXMLから情報引っ張る
if os.path.isfile(CONFIG_FILE):
    tree = XML.parse(CONFIG_FILE)
    root = tree.getroot()
    CONSUMER_KEY        = check_None(root,'consumer_key')
    CONSUMER_SECLET     = check_None(root,'consumer_secret')
    ACCESS_TOKEN_KEY    = check_None(root,'oauth_token')
    ACCESS_TOKEN_SECLET = check_None(root,'oauth_token_secret')
else:
    exit()

api = twitter.Api(
        consumer_key = CONSUMER_KEY,
        consumer_secret = CONSUMER_SECLET,
        access_token_key = ACCESS_TOKEN_KEY,
        access_token_secret = ACCESS_TOKEN_SECLET,
        cache=None
        )

#グローバルIPをつぶやいてみる
ip = None
if platform.system() == 'Windows':
    sock = urllib.urlopen('http://ipcheck.ieserver.net')
    ip = sock.read()
    sock.close()
elif platform.system() == 'Linux':
    ip = commands.getoutput('wget -q -O - ipcheck.ieserver.net')

if ip == None:
    exit()

#実際につぶやく
status = api.PostUpdate('{0}'.format(ip))
```

最後のところは適当に改造してください

oauthing.pyを作ったのはアプリの開発アカウントとは別アカウントでやりたかったからです。

cronでまわすのなら```CONFIG_FILE```の部分はフルパスのほうがいいかも