The jonki

呼ばれて飛び出てじょじょじょじょーんき

bottonZ: はてなの最近のニューエントリををTwitterに投稿

また作りましたw
はてなのニューエントリから適当に引っ張ってきて投稿する。
RSSで取ってきても良かったんだけど、ブクマしてるユーザ数を取りたかったためhtmlをパース。
BeautifulSoupで何ができて、何ができないのか、だんだん分かってきたような気がする。
にしても30分ごとの投稿がスリープ関数でやってるんだけど、果てしなくダサイよな。
普通どうやるんだろ。シェルスクリプトでも動かしてんのかな。

ちなみにbottonXのときもそうですが、importしてるtwitter.pyの140文字制限の部分はコメントアウトしてます。自分のはヴァージョン0.5で1050,1051行めの例外処理のトコ。



こんな感じで表示される。


#!/usr/bin/python
#-*- coding: utf-8 -*-

#@author Junki OHMURA
#@date 2009/02/12

import urllib2
from BeautifulSoup import BeautifulSoup
import twitter
import random
import time

url = 'http://b.hatena.ne.jp/hotentry'

def getKigi(_soup):
_kigi = []
for category, users, entry in zip(
_soup.findAll(attrs={'class': 'category'}),
_soup.findAll(attrs={'class': 'users'}),
_soup.findAll(attrs={'class': 'entry-body'}) ):
twt = ''
# twt = '[' + category.find('a').string + ']' #カテゴリ名
twt += '[' + users.find('a').string + ']' #ユーザ数
# print entry.find('a') #リンクタグごとタイトル表示
twt += entry.find('a').string #日記タイトル
twt += ' ' + entry.find('a')['href'] #日記タイトルのURL
_kigi.append(twt)

return _kigi


while(2>1):
html = urllib2.urlopen(url).read()
soup = BeautifulSoup(html)
kigi = getKigi(soup)
randKigi = random.randint(0,len(kigi)-1)

print kigi[randKigi]
tapi = twitter.Api(username=<ユーザネーム>, password=<パスワード>)
status = tapi.PostUpdate(kigi[randKigi])
time.sleep(1800) #単位は秒、1800秒=30分

bottonZZ: Twitterにニコニコのマイリスランキング100を投稿

またまた新作。
ニコニコのマイリストのランキングから30分に1回、ランダムな動画を投稿。
はてぶの人気エントリとりだすbottonZとプログラムはほぼ同じ。
BeautifulSoupを使ったHTMLレベルでのパースだしね。
違うのはログインしなきゃ目的URLが見れないとこね。
けどまぁ、ググったら30秒で解決したw

今まで30分に一回投稿、ってのをスリープ関数使ったダサいプログラム書いてたけど、今回はcrontabコマンドつかってプログラムの実行をスケジューリングしてみた。
crontabの使い方がイマイチ分からん!って人はコメントアウトしたところ使って今までどおりスリープ関数使えます。

今こんな感じに投稿してます


・cronNiko (cronの設定ファイル)


*/30 * * * * /home/hoge/python/runNiko.sh


・runNiko.sh

#!/bin/sh
python /home/hoge/python/nikoniko.py


・nikoniko.py

#!/usr/bin/python
#-*- coding: utf-8 -*-

#@author Junki OHMURA
#@date 2009/02/13

import re
import cookielib
import urllib
import urllib2
from BeautifulSoup import BeautifulSoup
import twitter
import random
import time

#参考:http://d.hatena.ne.jp/y_yanbe/20070827/1188160390#
def login(username, password):
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
req = urllib2.Request('http://www.nicovideo.jp/ranking/mylist/daily/all');
account = {"mail": username, "password": password}
req.add_data(urllib.urlencode(account.items()))
return opener.open(req).read()
# return opener


def getNiko(_soup):
_niko = []
for mylist, rank, video in zip(
_soup.findAll('a', href=re.compile('^openlist')), #openlistで始まるリンク
_soup.findAll('span',style=re.compile('^font')), #fontで始まるspan
_soup.findAll(attrs={'class': 'video'}) ): #class="video"
twt = ''
twt += '[' + mylist.find('strong').string + ' mylists: ' + rank.string + '位] '
twt += video.string
twt += ' http://www.nicovideo.jp/' + video['href']
# print '[' + mylist.find('strong').string + ' mylists: ' + rank.string + '位]'
# print video.string
# print ' http://www.nicovideo.jp/' + video['href']
_niko.append(twt)

return _niko

username = 'login-addr@com'
password = 'password'
html = login(username, password)
soup = BeautifulSoup(html)
niko = getNiko(soup)

html = login(username, password)
soup = BeautifulSoup(html)
niko = getNiko(soup)
randNiko = random.randint(0,len(niko)-1)

print niko[randNiko]
tapi = twitter.Api(username='bottonzz', password='botton')
status = tapi.PostUpdate(niko[randNiko])

"""
while(2>1):
html = login(username, password)
soup = BeautifulSoup(html)
niko = getNiko(soup)
randNiko = random.randint(0,len(niko)-1)

print niko[randNiko]
tapi = twitter.Api(username='bottonzz', password='botton')
status = tapi.PostUpdate(niko[randNiko])
time.sleep(1800) #単位は秒、1800秒=30分
"""

bottonZ: はてなの最近のニューエントリををTwitterに投稿

また作りましたw
はてなのニューエントリから適当に引っ張ってきて投稿する。
RSSで取ってきても良かったんだけど、ブクマしてるユーザ数を取りたかったためhtmlをパース。
BeautifulSoupで何ができて、何ができないのか、だんだん分かってきたような気がする。
にしても30分ごとの投稿がスリープ関数でやってるんだけど、果てしなくダサイよな。
普通どうやるんだろ。シェルスクリプトでも動かしてんのかな。

ちなみにbottonXのときもそうですが、importしてるtwitter.pyの140文字制限の部分はコメントアウトしてます。自分のはヴァージョン0.5で1050,1051行めの例外処理のトコ。



こんな感じで表示される。


#!/usr/bin/python
#-*- coding: utf-8 -*-

#@author Junki OHMURA
#@date 2009/02/12

import urllib2
from BeautifulSoup import BeautifulSoup
import twitter
import random
import time

url = 'http://b.hatena.ne.jp/hotentry'

def getKigi(_soup):
_kigi = []
for category, users, entry in zip(
_soup.findAll(attrs={'class': 'category'}),
_soup.findAll(attrs={'class': 'users'}),
_soup.findAll(attrs={'class': 'entry-body'}) ):
twt = ''
# twt = '[' + category.find('a').string + ']' #カテゴリ名
twt += '[' + users.find('a').string + ']' #ユーザ数
# print entry.find('a') #リンクタグごとタイトル表示
twt += entry.find('a').string #日記タイトル
twt += ' ' + entry.find('a')['href'] #日記タイトルのURL
_kigi.append(twt)

return _kigi


while(2>1):
html = urllib2.urlopen(url).read()
soup = BeautifulSoup(html)
kigi = getKigi(soup)
randKigi = random.randint(0,len(kigi)-1)

print kigi[randKigi]
tapi = twitter.Api(username=<ユーザネーム>, password=<パスワード>)
status = tapi.PostUpdate(kigi[randKigi])
time.sleep(1800) #単位は秒、1800秒=30分

bottonZZ: Twitterにニコニコのマイリスランキング100を投稿

またまた新作。
ニコニコのマイリストのランキングから30分に1回、ランダムな動画を投稿。
はてぶの人気エントリとりだすbottonZとプログラムはほぼ同じ。
BeautifulSoupを使ったHTMLレベルでのパースだしね。
違うのはログインしなきゃ目的URLが見れないとこね。
けどまぁ、ググったら30秒で解決したw

今まで30分に一回投稿、ってのをスリープ関数使ったダサいプログラム書いてたけど、今回はcrontabコマンドつかってプログラムの実行をスケジューリングしてみた。
crontabの使い方がイマイチ分からん!って人はコメントアウトしたところ使って今までどおりスリープ関数使えます。

今こんな感じに投稿してます


・cronNiko (cronの設定ファイル)


*/30 * * * * /home/hoge/python/runNiko.sh


・runNiko.sh

#!/bin/sh
python /home/hoge/python/nikoniko.py


・nikoniko.py

#!/usr/bin/python
#-*- coding: utf-8 -*-

#@author Junki OHMURA
#@date 2009/02/13

import re
import cookielib
import urllib
import urllib2
from BeautifulSoup import BeautifulSoup
import twitter
import random
import time

#参考:http://d.hatena.ne.jp/y_yanbe/20070827/1188160390#
def login(username, password):
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
req = urllib2.Request('http://www.nicovideo.jp/ranking/mylist/daily/all');
account = {"mail": username, "password": password}
req.add_data(urllib.urlencode(account.items()))
return opener.open(req).read()
# return opener


def getNiko(_soup):
_niko = []
for mylist, rank, video in zip(
_soup.findAll('a', href=re.compile('^openlist')), #openlistで始まるリンク
_soup.findAll('span',style=re.compile('^font')), #fontで始まるspan
_soup.findAll(attrs={'class': 'video'}) ): #class="video"
twt = ''
twt += '[' + mylist.find('strong').string + ' mylists: ' + rank.string + '位] '
twt += video.string
twt += ' http://www.nicovideo.jp/' + video['href']
# print '[' + mylist.find('strong').string + ' mylists: ' + rank.string + '位]'
# print video.string
# print ' http://www.nicovideo.jp/' + video['href']
_niko.append(twt)

return _niko

username = 'login-addr@com'
password = 'password'
html = login(username, password)
soup = BeautifulSoup(html)
niko = getNiko(soup)

html = login(username, password)
soup = BeautifulSoup(html)
niko = getNiko(soup)
randNiko = random.randint(0,len(niko)-1)

print niko[randNiko]
tapi = twitter.Api(username='bottonzz', password='botton')
status = tapi.PostUpdate(niko[randNiko])

"""
while(2>1):
html = login(username, password)
soup = BeautifulSoup(html)
niko = getNiko(soup)
randNiko = random.randint(0,len(niko)-1)

print niko[randNiko]
tapi = twitter.Api(username='bottonzz', password='botton')
status = tapi.PostUpdate(niko[randNiko])
time.sleep(1800) #単位は秒、1800秒=30分
"""