except でエラーを指定しなかった時にどんなエラーが発生したか見る
try: hogehoge() except: print sys.exc_info()[0]
って書こうとしてたら
exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
ってやるといいよ
[0]は1年後に困る羽目になるから
と教えていただいた!!!
1年後の自分が「なんじゃこりゃ」って言うという意味で
絶対言う、僕なら間違いなく言う。
あと「0番目が何なのかドキュメント見て調べるのめんどい」ともいいそう
すいませんでした><
僕も言うと思うので書き直します!!!
twitter で 60 日以上発言が無い人を remove する
いつのまにやら Twitter に Follow 制限とか出来て
色々な人の発言が見たいのに Follow 追加出来なくなって
コンピュータの癖に人間様の処理能力に制限かけるんじゃねーよと
お怒りのみなさまこんにちは
オープンソースとバザールモデルの御祭に参加出来なくてさみしい僕ですが、
みなさんいかがおすごしですか?
そんなこんなで Twitter にむかついても
「サポートに連絡しても制限解除するつもりはネーYO!!」
と言われてしまいますし、
かといってむかついたままなのも精神衛生上良くないので
60 日以上発言の無いユーザを remove するスクリプト書きますた。
pit と simplejson が入ってれば動くはずですwwww
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys, simplejson, urllib2, urllib from pit import Pit class TwitterClone(object): def __init__(self, user, passwd,url): self.user = user self.passwd = passwd self.url = url def post(self, text): text = text.encode('utf-8') self.getOpener().open(self.url + 'statuses/update.json', urllib.urlencode({'status':text})) def destroyFriend(self,id): url = self.url + ('friendships/destroy/%s.json' % id) r = self.getOpener().open(url,{}) data = simplejson.loads(r.read()) return data def getTimeline(self): url = self.url + 'statuses/friends_timeline.json' r = self.getOpener().open(url) data = simplejson.loads(r.read()) return data def getReplies(self): url = self.url + 'statuses/replies.json' r = self.getOpener().open(url) data = simplejson.loads(r.read()) return data def getFriends(self,page=1): url = self.url + 'statuses/friends.json?' + urllib.urlencode({'page':page}) r = self.getOpener().open(url) data = simplejson.loads(r.read()) return data def getOpener(self): passman = urllib2.HTTPPasswordMgrWithDefaultRealm() passman.add_password(None, self.url , self.user, self.passwd) authhandler = urllib2.HTTPBasicAuthHandler(passman) opener = urllib2.build_opener(authhandler) opener.addheaders = [('User-agent', 'TwitterCloneClient(http://d.hatena.ne.jp/jYoshiori/)')] return opener if __name__ == '__main__': twitter_config = Pit.get('twitter.com',{'require' : { 'user' : 'Your twitter name', 'password' : 'Your twitter password' }}) twitter = TwitterClone(twitter_config['user'], twitter_config['password'], 'http://twitter.com/') import rfc822 from datetime import datetime, timedelta from time import sleep lastMonth = datetime.now() - timedelta(days=60) wait = 45 removeCount = 0 print 'start' for index in range(1,1000): print 'page ' + str(index) friends = twitter.getFriends(index) if 0 == len(friends): break for user in friends: if user.has_key('status'): date = datetime(*rfc822.parsedate(user['status']['created_at'])[:7]) if lastMonth > date: print '%s is remov. last update %s' % (user['screen_name'],date) twitter.destroyFriend(user['id']) removeCount += removeCount sleep(wait) else : print '%s is remov.' % user['screen_name'] twitter.destroyFriend(user['id']) removeCount += removeCount sleep(wait) sleep(wait) print 'finish!!. %s remove' % str(removeCount)
これまたむかつく API 制限に引っかからないように
sleep を 45秒 入れてますので、寝るまえにでも起動しておけば朝には終ってると思います。
ちなみに僕は
4800人くらい → 3286人
になりました。
コアリズムより効果大です!!
※ 効果は個人によって差があります。
super() での疑問
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
解決 :mechanize.Browser が object を継承しない古いタイプのクラスだったみたい
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
これは OK
>>> class Foo(object): def __init__(self,text): super(Foo,self).__init__(self) ... >>> foo = Foo('test')
で、mechanize.Browser 継承して親のコンストラクタ呼ぼうとしたら
>>> import mechanize >>> class MyBrowser(mechanize.Browser): ... def __init__(self,userid,passwd): ... super(MyBrowser,self).__init__(self) ... >>> foo = MyBrowser('test','test') ------------------------------------------------------------ Traceback (most recent call last): File "<ipython console>", line 1, in <module> File "<ipython console>", line 3, in __init__ TypeError: super() argument 1 must be type, not classobj
なんで!?!?
教えてエロい人!!!
... super(MyBrowser,self).__init__(self)
を
... mechanize.Browser.__init__(self)
にすれば動くんだけど、なんかキモイなぁ><
東條さん!!大変です!!
僕、良くわかってないのですが、大変です!!
美人時計の画像を自分のサーバに保存して公開してる人がいます!!
http://image.baidu.jp/i?tn=baiduimage&ct=201326592&cl=2&word=site%3Abijint.com&lm=-1&z=0
これってすっごく不味いですよね!!
良くわかりませんけど><
権利に基づいた対応をとらせて頂くべきだと思います!!!
担当/東條 2009/03/12 02:28 いつも美人時計を拝見して頂き、ありがとうございます。
拝見させて頂きました。
現在、当社はプライバシーポリシーに違反する誘導、使用の取りやめのご協力をお願いしております。
3日以内に公開、使用の取りやめ行わない場合、権利に基づいた対応をとらせて頂く場合がございます。
ご協力宜しくお願いします。
東條
http://d.hatena.ne.jp/jYoshiori/20090311/1236768388#c1236792483
info@bijint.com
RE: 美人時計の画像ファイルが欲しい
http://d.hatena.ne.jp/Yamashiro0217/20090310/1236674979
のはてぶのタグに何故か Python タグがあったので、
これは Python で書けって事かなぁと思って書いてみました。
import sys,os,urllib,time;[[[globals().__setitem__('url','http://www.bijint.com/jp/img/photo/%02d%02d.jpg' % (i, j))] and [globals().__setitem__('file',open(os.path.basename(url), 'wb'))] and [file.write(urllib.urlopen(url).read())] and [file.close()] and [time.sleep(5)] for j in range(60)] for i in range(24)]
上記との違いは僕が外道では無いので sleep 入れてみたくらいでしょうか?
エラー処理とかはしてません><
ご利用は計画的に!!
RE:pythonの引数にある*hogeとか**mapとか
http://d.hatena.ne.jp/a2c/20090301/1235909666
を読んで……
>>> def func(userid,password): ... print userid , password ... >>> hoge= {'userid':'foo','password':'bar'} >>> func(**hoge) foo bar >>> def func2(foo,bar): ... print foo , bar ... >>> hoge=[1,2] >>> func2(*hoge) 1 2
関数を呼び出す側でも使える!!!!
これは超便利!!!
>>> value = '2008-03-10' >>> datetime(*map((lambda x: int(x)),value.split('-'))) datetime.datetime(2008, 3, 10, 0, 0)
LDR の未読をはてなグラフへ投稿する
id:tfunato に
「それ,Python でも出来るよ!!」
と,言った手前,コードを晒してみる
#!/usr/bin/env python # -*- coding: utf-8 -*- from hatenagraph import HatenaGraph from pit import Pit import urllib2 hatena_conf = Pit.get('hatena.ne.jp',{'require' : {'userid':'Your hatena.ne.jp userid','password':'Your hatena.ne.jp password'}}) livedoor_conf = Pit.get('livedoor.com',{'require' : {'userid':'Your livedoor.com userid'}}) r = urllib2.urlopen('http://rpc.reader.livedoor.com/notify?user=%s' % livedoor_conf['userid']) count = r.read().replace('|','') graph = HatenaGraph(hatena_conf['userid'],hatena_conf['password']) graph.post_data('LDR未読数',count)
あぁ,HatenaGraph の実装書きなおしたいなぁ……