Home > Tech > Twitter > 支持OAuth的Twip

支持OAuth的Twip

Add a comment April 25th, 2010 http://s.ibron.co/lgjpw2

Twitter官方宣布将在6月30日终止对Basic Authorization验证方式的支持,广大使用API的天朝网民纷纷表示鸭梨很大~目前最新版的3.0版Twip还不支持OAuth(2.2版支持),前几天问了下yegle童鞋,最近似乎都没有更新计划。正好最近不算太忙,一时手痒,经过一星期的“艰苦奋战”,终于让Twip 3.0支持了OAuth,命名为Twip 3.1~~原本前几天就打算发出来的,这几天不断有改进的想法冒出来,本着“精益求精”的想法,拖到了今天…… :!:

系统要求

  1. PHP版本大于5.2.4并已启用curl
  2. 若采用Apache需支持mod_rewrite
  3. mcrypt库(用于加密access token,没有也能工作)

配置方法

猛击这里下载源代码。另外,也可以使用svn checkout这个地址:http://twip.googlecode.com/svn/branches/heybronco/。基本的配置方法可参见yegle写的wiki。这里主要说一下OAuth的部分。

  1. 使用OAuth验证发推时将不显示连接到twip的客户端,而是显示与twip中OAuth CONSUMER_KEY和CONSUMER_SECRET对应的注册程序。源代码里已经包含可用的CONSUMER_KEY和CONSUMER_SECRET,对应的程序名称为”Development”,这个是编写”TwitterOAuth Library”的Abraham Williams放在示例代码中的(已经失效)。若希望使用自定义的程序名,请前往Twitter程序中心注册一个新程序,注册的时候Application Type选”Browser”,Callback URL填入填写能访问到”callback.php”文件的完整网址,Default Access type选”Read & Write”。注册完成后将”CONSUMER_KEY”和”CONSUMER_SECRET”填入”oauth_config.php”中。
  2. “oauth_config.php”为OAuth相关配置的文件,其中OAUTH_DIR指定保存OAuth token文件的位置,请放在一个web用户无法访问的目录中,比如public_html(www)目录的上一级,注意权限问题,同时确保以”/”结尾CONSUMER_KEYCONSUMER_SECRET使用默认或者替换成自己的;OAUTH_CALLBACK中填写能访问到”callback.php”文件的完整网址;SECURE_KEY中保存的是加密数据所用的随机字符,可以随便填入字符,或者保持默认。
  3. 检查index.php中”enable_oauth”项已经为true以启用OAuth,配置完成。

使用方法

访问twip的首页,页面将显示当前Twip所使用的身份验证方法等运行状态及操作说明。注意,若twip的架设者启用了”PRIVATE_API”选项,首页上将给出提示,此时需要确保自己处于被允许的用户范围,否则即使获得了access token也无法使用此API。另外,access token是否被加密存储也会显示在首页上。

获得access token需要翻墙。点击”Sign in with Twitter”按钮,进入Twitter登陆界面,输入自己的用户名和密码后,转到授权界面,询问是否授予相应权限给应用程序,点击”Access”按钮,进入保存token界面,此时要求输入密码。这个密码是用于访问保存在twip服务器上的access token文件的密码,所有通过此twip进行的发推等操作均需要使用此密码,这里称为API密码。API密码可以与自己的Twitter密码相同或不同,但若要使用Mixero,请填写Twitter密码。因为Mixero不通过API来校验密码,若API密码与Twitter不同,要么无法登陆,要么无法获得Twitter信息。完成后点击”保存”按钮,页面跳转到首页。若能看到你的timeline,说明access token获得成功。之后就可以在客户端使用用户名和API密码登陆了。

如果忘记了自己的API密码,可以点击”Sign in with Twitter”按钮来重新获得access token,原来的记录将被覆盖。若不想再继续使用此API,可进入自己的Twitter设置界面,在”connections”页面中找到此API,然后点击”Revoke Access”来移除访问许可。当然,也可以直接把twip中保存的access token删除,方法是在首页上点击”login”,输入用户名和API密码后,点击”remove the token”即可。

使用Gravity等支持OAuth的客户端需要注意一下,在添加账户的时候验证类型要选Plaintext而不是Oauth/Secure,同时账户密码填入的是API密码。Update:用户名不能填email,否则会验证失败。(才知道原来能用email登陆Gravity,thanks to mxwu)

对于想使用byethost主机的筒子们屏蔽了twitter的主机,很遗憾,使用ip替换是没办法使用OAuth的。因为在请求token的时候若使用ip地址来访问,Twitter会返回一个301,重定向到twitter.com。若点击”Sign in with Twitter”之后出现”Could not connect to Twitter. Refresh the page or try again later.”,最大的可能是主机屏蔽了Twitter,目前除了换主机以外没有解决办法。当然,敝人水平有限,也许有解决办法也说不定,这个就等待高人来解决了。 :cool: 另一种可能是key和secret失效,这个可以通过查看Debug info的http_code来确定。若为401,则表示key和secret已经失效。

安全问题

之前在推上看到有人质疑兽兽@showfom的饭否会有安全性问题,这边也会着重考虑这个问题。

若空间支持mcrypt库,access token会被加密。是否加密会在首页显示,你可以据此决定是否使用此API。access token以API密码和SECURE_KEY作为密钥进行blowfish加密。API密码将进行MD5计算,结果拼接SECURE_KEY后进行第二次MD5计算,计算结果和access token的密文以文件的形式进行保存。这样,即使是twip的拥有者也无法使用access token。若空间不支持mcrypt库(这个基本很少吧),access token将不会加密。

当然,因为twip是完全开源的,谁都可以来修改代码,上面说的安全性不一定能得到保证。至于用不用,看你自己吧。

版权

Twip原版使用Mozilla Public License 1.1授权,TwitterOAuth库虽没写明授权协议,但也有相关授权说明。若需要进行再次开发以及发布,请一定遵从相关协议的说明。

其他

感谢党,感谢国家,感谢@yegle@xmxsuperstar,感谢Abraham Williams,感谢Dreamhost。

Twip原版的相关信息可参考其Project Website。TwitterOAuth库相关信息参考这里

ps一句,本来打算找个免费空间来演示的,可惜找了几个都没搞定,哎~~~大家就自己慢慢试吧~ :smile:

以上!

  1. April 25th, 2010 at 22:23 | #1
    Reply Quote

    沙发,谢谢了!

  2. April 25th, 2010 at 22:31 | #2
    Reply Quote

    @yueerfei
    呵呵~速度很快啊~~

  3. love_stef
    April 26th, 2010 at 13:13 | #3
    Reply Quote

    停止Basic Authorization验证方式会怎么样?普通的API没办法用了?

  4. April 26th, 2010 at 15:15 | #4
    Reply Quote

    @love_stef
    是的。普通API通过Basic Authorization来验证身份。

  5. April 26th, 2010 at 16:10 | #5
    Reply Quote

    狂顶了….谢谢了

  6. April 26th, 2010 at 17:54 | #6
    Reply Quote

    oauth + twip配合Gravity的成功例子么?

    折腾了许久也为成功。。

    不知道是Gravity的问题还是twip的问题。

  7. April 26th, 2010 at 19:35 | #7
    Reply Quote

    @mxwu
    嗯~文章里加了段说明,添加账户的时候验证类型要选Plaintext而不是Oauth/Secure,同时账户密码填入的是API 密码,可以再试一试。我自己测试是成功的。 :cool:

  8. i_maidou
    April 26th, 2010 at 19:51 | #8
    Reply Quote

    去折腾试试

    PS 这首歌很熟悉的说~

  9. April 27th, 2010 at 00:09 | #9
    Reply Quote

    @Bronco
    选plaintext的话还是oauth么?
    twitter马上要关闭plaintext验证了,所以在寻找oauth的方法。

  10. April 28th, 2010 at 00:07 | #10
    Reply Quote

    @mxwu
    是的。现在twip的工作原理是对Twitter的读写采用OAuth,所以Twitter那边关闭了basic auth也没问题。而twip与客户端的交互采用的是basic auth,所以会有个API密码。因为现在twip还无法直接转发OAuth的验证数据,所以采用了这种工作机制。

  11. April 28th, 2010 at 19:21 | #11
    Reply Quote

    俺也去折腾看看

  12. April 29th, 2010 at 15:43 | #12
    Reply Quote

    @Bronco
    多谢折腾了一会终于搞定了。
    Gravity一定要用用户名而不是email,这点补充进去吧:)

  13. April 29th, 2010 at 16:23 | #13
    Reply Quote

    @mxwu
    诶?我所有的登陆都是用用户名的啊~原来Gravity用email也可以啊? ;-) 新版twip是按照screen_name来保存token的,用email肯定是搞不定的。估计老版本的因为是直接发送,所以可以吧。anyway,thanks~

  14. May 1st, 2010 at 17:16 | #14
    Reply Quote

    您用的是Dreamhost空间吗?
    我在Dreamhost上的Twip本来用得好好的,这两天突然坏了,没有用OAuth,最基本的都不行了,那个测试网页应该可以显示5条最新tweet的,现在也显示failed。换了好几个版本的Twip都不行,太郁闷了,难道是Dreamhost把这个封了?……

  15. May 2nd, 2010 at 01:09 | #15
    Reply Quote

    @小骆驼商队
    是的啊~目前来看似乎一切正常~
    其实检查API是否正常工作最简单和直接的办法是直接获取public_timeline,比如输入:“你的api地址”/statuses/public_timeline.xml,如果API正常,会返回xml格式的最新的推。如果问题出在Twitter服务端,也会返回相应的错误信息,这样排查问题会快很多。
    提醒一下,如果通过API进行调用时密码错误超过一定次数(似乎是5次,不太确定),账户会被锁定一定的时间。你可以通过上面说的获得xml文件的方式获得提示信息。
    Good Luck :cool:

  16. May 2nd, 2010 at 14:05 | #16
    Reply Quote

    @Bronco
    非常感谢!现在弄好了 :)

  17. May 3rd, 2010 at 02:19 | #17
    Reply Quote

    Gravity的作者从6390版本开始,屏蔽了API的plaintext认证方式,怎么解决?!

  18. May 3rd, 2010 at 22:52 | #18
    Reply Quote

    @小元
    你从哪得到的这个消息?我的6390能正常工作啊~Authentication选的是”Proxy/Plaintext”。

  19. May 4th, 2010 at 00:12 | #19
    Reply Quote

    @Bronco
    我在opda上看到盖茨大大说的,然后试了gravity6390版,在add用户的时候没法选择plaintext啊。

  20. May 4th, 2010 at 00:25 | #20
    Reply Quote

    @Bronco
    我又google了一下,6390确实只能通过oauth登陆,很多人都开始用6375这个老版本,比如我。bronco兄你核实一下?

  21. Sphinx
    May 4th, 2010 at 00:37 | #21
    Reply Quote

    Could not connect to Twitter. Refresh the page or try again later.
    点击”Sign in with Twitter”按钮时一直这样~请问怎么解决啊??

  22. Sphinx
    May 4th, 2010 at 01:30 | #22
    Reply Quote

    @小元
    貌似正版的有plaintext方式~D版没有
    不知以后会不会一直这样

  23. Sphinx
    May 4th, 2010 at 01:32 | #23
    Reply Quote

    @Bronco
    Could not connect to Twitter. Refresh the page or try again later.
    点击”Sign in with Twitter”按钮时一直这样~请问怎么解决啊??
    换了hyperphp和byteact两个空间都是这样~

  24. May 4th, 2010 at 10:17 | #24
    Reply Quote

    @小元
    嗯,我的是正版的Gravity,有Proxy/Plaintext的,不知道D版是不是没有了。 :cool:

    @Sphinx
    这个一般是因为主机空间把Twitter域名给屏蔽了。因为OAuth验证的关系,使用ip地址来代替域名是无效的,会自动跳转。目前我也没什么办法….. :!: 不如你试试2.2版的twip看看能不能连接~~

  25. weather8620
    May 4th, 2010 at 14:44 | #25
    Reply Quote

    悲剧。。 Sign in with Twitter 按钮
    只能 输入密码。 没有输入账号的 地方。

  26. Zhoong
    May 4th, 2010 at 15:41 | #26
    Reply Quote

    dreamhost可以搭建支持ouath的api么?

  27. May 4th, 2010 at 15:56 | #27
    Reply Quote

    @weather8620
    你说的是跳转到Twitter之后?不应该啊~~仔细看一下使用说明,是不是哪里弄错了?

    @Zhoong
    可以啊~我的就是在dh上搭建的。

  28. ningye
    May 4th, 2010 at 16:49 | #28
    Reply Quote

    现在有没有在哪个freehost上成功搭建的呢?

  29. kajisan
    May 4th, 2010 at 17:33 | #29
    Reply Quote

    Could not connect to Twitter. Refresh the page or try again later.

    dreamhost 。。。难道也悲剧了?

  30. 物语哲言
    May 4th, 2010 at 17:55 | #30
    Reply Quote

    我的空间不支持twip3,只支持twip2。怎么弄

  31. Sphinx
    May 4th, 2010 at 18:07 | #31
    Reply Quote

    物语哲言 :
    我的空间不支持twip3,只支持twip2。怎么弄

    可参考这篇文章http://4zai.net/137

    请问你用的是什么空间啊?~我连支持twip2的都没找到

  32. weather8620
    May 4th, 2010 at 19:42 | #32
    Reply Quote

    http://u.ntes.in/callback.php?oauth_token=0LqrQUyM2SGNzkb2zD6GnbKnqg0SuKuwKAf1M&oauth_verifier=SCCGK5DCfeKRjkA7qEoNKglY90VOps3osX82VANSP0

    一点那个 Sign in with Twitter 就跳到这里来了。

    都没有调用其 TWITTER 那个出来。

  33. flyingkk
    May 4th, 2010 at 20:54 | #33
    Reply Quote

    在浏览器里使用正常,可以用test看到推,但输入到客户端没反应。空间用的是http://4zai.net/137中作者写的那个。

  34. Sphinx
    May 4th, 2010 at 21:16 | #34
    Reply Quote

    flyingkk :
    在浏览器里使用正常,可以用test看到推,但输入到客户端没反应。空间用的是http://4zai.net/137中作者写的那个。

    望LS继续折腾后分享经验~俺现在头都晕鸟

  35. May 4th, 2010 at 22:38 | #35
    Reply Quote

    @all
    经验证原来oauth_config.php里的KEY和SECRET已经失效,请自行到twitter申请新的app并将对应的KEY和SECRET填入文件内。使用原来的KEY和SECRET将无法连接到Twitter,返回”Could not connect to Twitter.”

  36. May 4th, 2010 at 22:42 | #36
    Reply Quote

    @weather8620
    这个是因为你的浏览器里已经默认保存了twitter的登陆信息,你看到的输入密码的界面实际是从twitter返回之后输入api密码的地方。

    @flyingkk
    是twip3.0吗?确认输入客户端的地址、用户名、密码(是api密码)是否正确。

  37. kajisan
    May 4th, 2010 at 23:01 | #37
    Reply Quote

    折腾好了。。但是发现twidroid 跟seesmic 都不支持oauth…..我折腾是为个啥啊

  38. May 4th, 2010 at 23:05 | #38
    Reply Quote

    @kajisan
    :!: 你还没明白twip3的工作原理。目前的情况是,twip3使用OAuth跟twitter交换数据,而使用Basic auth来跟客户端交换数据,所以对客户端来说,仍然是basic auth的方式。如果客户端支持并启用OAuth,例如Gravity,twip3是无法工作的。

  39. kajisan
    May 4th, 2010 at 23:26 | #39
    Reply Quote

    那我通过web用username 跟api password 可以获得timeline
    但twdroid 跟seesmic 均无法成功连接。。这又是什么错啊。。

  40. ray
    May 5th, 2010 at 00:05 | #40
    Reply Quote

    现在就缺一个freehost可以通过access token……唉

  41. kajisan
    May 5th, 2010 at 00:32 | #41
    Reply Quote

    已经成功搞定。。重新设置api密码为twitter密码后依然无法。。

    仔细看配置。。然后发现是oauth的路径估计有些问题。。应该是需要个服务器路径。
    于是ssh上去之后pwd了一下。拷贝路径过来。解决。。

  42. Sphinx
    May 5th, 2010 at 00:57 | #42
    Reply Quote

    Not Found

    The requested URL /twip/oauth.php was not found on this server.

    Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
    Apache/2.2.15 (Unix) mod_ssl/2.2.15 OpenSSL/0.9.8e-fips-rhel5 mod_bwlimited/1.4 PHP/5.3.2 Server at dwe126.melgurt.com Port 80

    在授权界面点击Allow之后出现这个提示~怎么解决?

  43. @yueerfei
    May 5th, 2010 at 10:17 | #43
    Reply Quote

    @Bronco
    Bronco,目前的代码修改后是否可以用于byethost这样的免费空间呢?

  44. Roy
    May 5th, 2010 at 10:33 | #44
    Reply Quote

    用了OAuth后,还可以多个账户都通过这个方式中转么?还是只能一个人用这个twip api了?

  45. May 5th, 2010 at 13:49 | #45
    Reply Quote

    @kajisan 可能是把gzip压缩启用了,关掉它

  46. May 5th, 2010 at 13:58 | #46
    Reply Quote

    我建的几乎都成了,allow回来后输入自己密码无法显示最近的几天推,自己用客户端也不行。请问怎样解决,是空间的问题吗?我空间装twip2成。谢谢 :smile:

  47. kh9n
    May 5th, 2010 at 14:58 | #47
    Reply Quote

    我按照这个文档建好了,但是有一个问题:
    1。当我从twidroid里面链接api的时候提示我twitter不能给我的账号授权
    2。在通过web访问我的api的login.php的时候浏览器会弹出登录对话框,内容类似于“A username and password are being requested by http://myapihostserver. The site says: “Twip login””,这个时候无论输入推特账号密码还是api密码都无法登录,甚至输入我在空间注册的账号密码也不行。

    但是访问index.php则可以显示最近的五个消息,同时尝试“/statuses/public_timeline.xml”也可以读取到正确的xml,请问一下博主,我这个是什么情况?谢谢了。

  48. kh9n
    May 5th, 2010 at 15:02 | #48
    Reply Quote

    从twidroid里面出来的出错消息:could not authenticate you. Maybe your login information is incorrect or your account is locked after too many failed attempts to sign in. Please chillax for a few, then try again.

  49. kh9n
    May 5th, 2010 at 15:40 | #49
    Reply Quote

    直接连接login.php弹出的对话框信息:Twip login上的 mytwiphoster:80 服务器要求提供用户名和密码。

  50. May 5th, 2010 at 16:34 | #50
    Reply Quote

    这个坚决支持,学习。

  51. weather8620
    May 5th, 2010 at 17:01 | #51
    Reply Quote

    救命

    http://u.ntes.in/twip/index.php

    谁帮我测试下。 为什么到了最后一步。 输入了两次 api 密码。 loadin。。 然后就failed

  52. Roy
    May 5th, 2010 at 17:09 | #52
    Reply Quote

    是不是开了oauth以后basicauth就没法用了?

  53. weather8620
    May 5th, 2010 at 17:19 | #53
    Reply Quote

    199.71.215.14 – - [05/May/2010:02:17:36 -0700] “GET /statuses/friends_timeline.json?count=5 HTTP/1.1″ 404 505 “http://u.ntes.in/index.php” “Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3″ |

    悲剧的 404

  54. tianchaoren
    May 5th, 2010 at 17:23 | #54
    Reply Quote

    希望能出个gae版本的。现在的免费php空间难找而且大部分都不支持curl

  55. 四仔
    May 5th, 2010 at 18:28 | #55
    Reply Quote

    其实我想问twip2.2和3.0的区别是什么呢,同样是oauth呢~

  56. May 5th, 2010 at 19:00 | #56
    Reply Quote

    @四仔
    架构的改变吧~功能上似乎差不多。不过2.2有个安全问题,当A通过OAuth取得token存入服务器后,B有可能使用A的token来发送消息。这个在3.0里进行了修正,token是加密的,前提是空间要支持mcrypt库。

    @tianchaoren
    python和java都不是很熟,心有余而力不足诶~~不过似乎有基于java版的类似twip的东西。

    @Roy
    7月底吧记忆中,关闭之后basic auth无法从官方获取数据了。

    @kh9n
    既然能获得public_timeline,就表明至少OAuth的部分应该没什么问题了。可以考虑换个桌面版的客户端试试看。

    @fanzheng
    注意区分一下api密码和twitter密码。你也可以检查oauth目录看看有没有对应的.oauth文件生成。

    @Roy
    可以多人共用,每个人都使用自己的username和api密码来进行验证。

    @@yueerfei
    目前不能。

  57. 四仔
    May 5th, 2010 at 19:10 | #57
    Reply Quote

    @Bronco
    嗯,twip3.0应该还是比2.2好的。既然有3.0我就不用2.2的那个了。
    顺便也在我那篇文章加了个link过来了。。

  58. 物语哲言
    May 5th, 2010 at 19:17 | #58
    Reply Quote

    不少空间不支持3.0,这也是问题@四仔

  59. kh9n
    May 5th, 2010 at 19:39 | #59
    Reply Quote

    多看了一下发现,只要我clear session,之后就无法获得public_timeline了。需要登录。而登录界面正如我描述的,始终无法登录,一直弹登录窗口。

  60. kh9n
    May 5th, 2010 at 19:45 | #60
    Reply Quote

    我跟查了一下源代码。。发现在dorequest(){…}函数中,$this->username获得的是空,所以虽然我的.oauth文件存在,但是在执行
    if( !file_exists( OAUTH_DIR.$this->username.’.oauth’ )) {
    header(“HTTP/1.1 403 Forbidden”);
    exit();
    }
    的时候会出错。
    另外,我把twip放在根目录下”/”,在pre_request(){…}里面,这句话是不是有问题?
    if(strlen($this->webroot) == 0){//use “/” as webroot
    $this->request_api = strval(substr($_SERVER['REQUEST_URI'],1));
    我觉得应该是
    if(strlen($this->webroot) == 0){//use “/” as webroot
    $this->request_api = strval(substr($_SERVER['REQUEST_URI'],0));
    否则$this->request_api会获取失败。。
    请指教。。。

  61. kh9n
    May 5th, 2010 at 19:48 | #61
    Reply Quote

    不知道是不是我空间配置或者空间自身的问题。。我用的是http://x10hosting.com的免费空间。

  62. May 5th, 2010 at 20:35 | #62
    Reply Quote

    @kh9n
    原来那样写是对的,需要去掉第一个”/”。至于x10hosting,很遗憾,似乎他们家的主机的mod_rewrite有问题,之前我也尝试过,总是获取不到用户名和密码。在支持论坛上发了帖子也没人理…… :!:

  63. mytion
    May 5th, 2010 at 21:10 | #63
    Reply Quote

    好教程,要是再配个图就更棒啦!原来我一直没有建立一个OAuth的文件夹(这个文件夹建在不能被用户直接访问到的位置,即博主提到的public_html(www)目录的上一级),所以导致失败。另外在oauth_config.php这个文件的变量OAUTH_DIR的路径必须和OAuth的这个文件夹的路径一致。

  64. kh9n
    May 6th, 2010 at 00:27 | #64
    Reply Quote

    @Bronco
    谢谢回复。。再另外一个免费空间上搭好了。确实可以用。非常赞。谢谢你的工作以及分享。

  65. Sphinx
    May 6th, 2010 at 00:54 | #65
    Reply Quote

    @kh9n
    请问你用的是什么免费空间啊?

  66. @granvals
    May 6th, 2010 at 08:48 | #66
    Reply Quote

    我的都搭建成功了,最后的timeline也出现了,可是我把api地址键入gravity的时候出现了api上限,这是什么问题啊?

  67. kh9n
    May 6th, 2010 at 10:39 | #67
    Reply Quote

    @Sphinx 我是在 http://www.host1free.com/ 上申请的免费空间。我在手机上面访问速度还可以接受。移动GPRS。

  68. kh9n
    May 6th, 2010 at 11:09 | #68
    Reply Quote

    见鬼了。。这里会自动删除comments么。。还是因为我写了url进来?
    @Sphinx 我用的是host1free提供的免费空间,有什么问题可以在推上问我 @kh9n

  69. May 6th, 2010 at 14:51 | #69
    Reply Quote

    Gravity现在已经可以自动获得access token
    用Gravity的用户不用担心7月的来临,哈哈 :mrgreen:

  70. weather8620
    May 6th, 2010 at 14:56 | #70
    Reply Quote

    lz 你好。 你的 打包文件缺乏 .htacess 文件 赶紧补上吧。

    cat .htaccess

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

  71. weather8620
    May 6th, 2010 at 15:47 | #71
    Reply Quote

    楼主 能不能抽空 改下代码 支持 140 自动截断?

  72. jixi
    May 6th, 2010 at 18:09 | #72
    Reply Quote

    请问现在支持gzip压缩 不?

  73. May 6th, 2010 at 18:57 | #73
    Reply Quote

    @kh9n
    被akismet认定为spam了…..

    @Qing
    嗯,Gravity还是很不错的,但只能在Symbian上用啊~

    @weather8620
    我的zip压缩包里有.htaccess啊~~140截断有空再改吧。

    @jixi
    twip一直都支持gzip压缩啊~只是貌似跟Gravity配合得不太好,原因未知… :!:

    @@granvals
    估计是同一个IP上的twip太多了 :smile:

  74. Sphinx
    May 6th, 2010 at 19:31 | #74
    Reply Quote

    @kh9n
    谢了~已经搞定了,呵呵~

  75. tianchaoren
    May 6th, 2010 at 21:24 | #75
    Reply Quote

    博主有gt什么的可以联系么?
    我建的api在浏览器上一切正常,但是在手机上无法使用。我登陆ftp发现oauth那个目录是空的。不知道问题出在哪里。

  76. May 6th, 2010 at 23:14 | #76
    Reply Quote

    @tianchaoren
    检查一下oauth_dir的配置是否正确,对应文件夹是否具有写权限。

  77. 三叶草
    May 7th, 2010 at 19:29 | #77
    Reply Quote

    点击”Sign in with Twitter”之后出现设置密码的页面 点击保持后出现以下提示 请问怎么解决?

    Warning: file_put_contents(/domains/hsgj01427.kuheo.com/hsgj01427.oauth) [function.file-put-contents]: failed to open stream: No such file or directory in /home/hsgj01/domains/hsgj01427.kuheo.com/public_html/savetoken.php on line 30

    Warning: Cannot modify header information – headers already sent by (output started at /home/hsgj01/domains/hsgj01427.kuheo.com/public_html/savetoken.php:30) in /home/hsgj01/domains/hsgj01427.kuheo.com/public_html/savetoken.php on line 32

  78. May 8th, 2010 at 23:15 | #78
    Reply Quote

    @三叶草
    看起来似乎是oauth目录设置得不对,有些主机会把路径截断,所以你需要确实一下oauth文件夹的“可访问”路径,也就是通过php可以访问得到的路径。另外一点是可能权限设置得不对,最简单的方法是设置为777.

  79. May 9th, 2010 at 00:57 | #79
    Reply Quote

    感谢你提供的程序和说明,我已经架设成功^^
    twip3.0+gravity在开启压缩时会无法使用,你提供的程序也存在这个问题,可以参照这一ISSUE来解决,将twip.php第186行的header注释掉,如果认为妥当建议更新源代码。

  80. Sphinx
    May 9th, 2010 at 04:04 | #80
    Reply Quote

    @Diky
    请问LS用的是哪个空间?付费的还是免费的?~

  81. May 9th, 2010 at 08:38 | #81
    Reply Quote

    @Sphinx
    付费空间…

  82. May 9th, 2010 at 08:57 | #82
    Reply Quote

    @Diky
    已经修正源代码,感谢! ;-)

  83. May 9th, 2010 at 10:26 | #83
    Reply Quote

    @mytion
    请问我的oauth目录一直是空的是什么原因啊?我放在上以及上一级目录了,config里面是不是填写 类似 /home/dning1/oauth 这样的啊?

  84. May 9th, 2010 at 10:33 | #84
    Reply Quote

    我的现在在web页面可以访问到最新的5条推,但是电脑客户端无法登陆,gravity总是提示“api达到上限”,这是什么原因? 求楼主指导~~

  85. May 9th, 2010 at 10:36 | #85
    Reply Quote

    对了,phpinfo显示 _SERVER["DOCUMENT_ROOT"]为/home/dning1/public_html 上一级目录的oauth文件夹权限已经设置为777了。。

  86. LUCYFOUR
    May 9th, 2010 at 12:30 | #86
    Reply Quote

    @三叶草
    我也在这步出现这些。
    我用bluehost的共享主机,只有FTP,我自己无法访问到我域名文件夹的上级目录的,能不能把oauth文件夹放在twip文件夹的上一级目录呢?

  87. May 9th, 2010 at 19:30 | #87
    Reply Quote

    @dning1
    你在web页面点击”clean session”之后再点击”show your timeline”看看能不能看到推。因为如果oauth文件没有生成成功的话客户端是没办法用的。而网页是因为从twitter返回后token存在session里了。

    @LUCYFOUR
    理论上把oauth文件夹放在哪里都是可以的。推荐放在域名文件夹上一层主要是考虑安全性,让网页访问者无法获得oauth文件。

  88. May 9th, 2010 at 19:41 | #88
    Reply Quote

    果然没法生成啊。。。是不是主机的缘故?我的是uhosting。。。

  89. May 9th, 2010 at 22:29 | #89
    Reply Quote

    @dning1
    oauth_config.php里oauth_dir要以”/”结尾。如果还是不行的话有可能是主机的问题了。uhosting没用过,不好说。

  90. byelims
    May 10th, 2010 at 00:14 | #90
    Reply Quote

    请教博主,我在一个空间上尝试搭建了一个,现在的状况是OAuth文件夹下成功写入了文件,也没有报错,但是最后测试Timeline的时候总显示Failed,问题可能出在哪儿呢?感谢~

  91. May 10th, 2010 at 21:04 | #91
    Reply Quote

    呃,我在hoat1free搭建的rupai.net域名验证后输入API密码后显示:

    Warning: file_put_contents(OAUTH_DIRdning1.oauth) [function.file-put-contents]: failed to open stream: Permission denied in /home/dning/domains/dning.rupai.net/public_html/t/savetoken.php on line 30

    Warning: Cannot modify header information – headers already sent by (output started at /home/dning/domains/dning.rupai.net/public_html/t/savetoken.php:30) in /home/dning/domains/dning.rupai.net/public_html/t/savetoken.php on line 32

    这是什么原因呢?

    而且返回后可以显示推,但还是没有oauth文件生成,oauth_dir目录是以 / 结尾的。。

  92. soho
    May 11th, 2010 at 09:57 | #92
    Reply Quote

    byelims May 10th, 2010 at 00:14 | #90 请教博主,我在一个空间上尝试搭建了一个,现在的状况是OAuth文件夹下成功写入了文件,也没有报错,但是最后测试Timeline的时候总显示Failed,问题可能出在哪儿呢?感谢~

    同问!

  93. May 11th, 2010 at 13:08 | #93
    Reply Quote

    @dning1
    文件夹权限的问题。把oauth文件夹的权限设置为777。

    @soho
    @byelims
    可以尝试直接在浏览器中输入“你的api地址”/statuses/public_timeline.xml,如果API正常,会返回xml格式的最新的推。如果问题出在 Twitter服务端,也会返回相应的错误信息。多次尝试通过API来获取数据并且验证失败的话,账户会被锁定一段时间的。

  94. May 11th, 2010 at 13:11 | #94
    Reply Quote

    今天搭建成功啦,uhosting的主机,只改oauth_dir,key,secret,callback.php地址,建立oauth文件夹修改权限直接上传就行了~~~~

    我之前把文件夹名改成 “t”,修改了twip和index两个文件汇总的目录,结果就不能保存oauth文件了,请问有办法让他处于“t”文件夹下吗?

  95. xxxx
    May 11th, 2010 at 16:05 | #95
    Reply Quote

    不小心把oauth文件中的文件删除了,无论我怎么操作都再也保存不了那个文件 了,怎么办啦

  96. tianchaoren
    May 12th, 2010 at 18:50 | #96
    Reply Quote

    使用gzip后gravity无法使用没显示内容但是有流量消耗。

  97. darky
    May 13th, 2010 at 07:13 | #97
    Reply Quote

    请问 启用了”PRIVATE_API”选项 ,修改哪里开启?

  98. darky
    May 13th, 2010 at 07:15 | #98
    Reply Quote

    @三叶草
    config里的OAUTH_DIR改为/home/hsgj01/domains/hsgj01427.kuheo.com/oauth/ 路径
    777权

  99. wearelu
    May 13th, 2010 at 16:59 | #99
    Reply Quote

    @mytion
    不好意思很才的问一下怎样“在oauth——config.php里面表示public_html(www)目录的上一级?”我已经在这一级建了oauth文件夹,777权限。可是不知道在oauth——dir后面怎么表示,谢谢帮助。

  100. Syringa
    May 13th, 2010 at 20:41 | #100
    Reply Quote

    囧。用uhosting.org搭建的twip在网页段成功生成了token,但用在gravity上一直显示api到达上限。求帮助。

  101. May 14th, 2010 at 12:13 | #101
    Reply Quote

    @Syringa
    检查oauth文件夹里是否有.oauth文件,有的话可能是同一ip请求次数过多,可以等一段时间再试。

    @darky
    index.php里的”private_api”设为true,把自己的用户名放到”allowed_users”里。

    @tianchaoren
    有什么提示么?有些主机会打开全局gzip压缩,这个时候twip的”docompress”不能设为true。

    @xxxx
    既然能生成,在配置没更改的前提下肯定可以再次生成的。

  102. tianchaoren
    May 14th, 2010 at 12:18 | #102
    Reply Quote

    没什么特别的提示,看起来一切正常。而且打开gzip只是在gravity里面不正常,在电脑端和手机端的twibble却可以正常使用。可是我很少听别人说打开gzip后gravity不能用。是dreamhost的合租空间。不打开gzip流量很大,打开了gzip后api又与gravity无缘:(

  103. May 14th, 2010 at 12:27 | #103
    Reply Quote

    @tianchaoren
    dreamhost是全局打开gzip的,twip把docompress设置false,Gravity把use zlib comp设为yes就行了。我用的也是dh的空间,这样设置可以用,数据已经压缩了。另外,gravity上如果有关于gzip的错误会提示网络错误-36。

  104. tianchaoren
    May 14th, 2010 at 16:33 | #104
    Reply Quote

    “dreamhost是全局打开gzip的,twip把docompress设置false,Gravity把use zlib comp设为yes就行了。我用的也是dh的空间,这样设置可以用,数据已经压缩了。”
    这个确实是这样。谢谢。
    还有一个问题我一直想不通。我想使用ssl加密的api,但是代价太大(独立IP加SSL证书一年的花费很大)。而基于gae的appspot的api可以使用appspot自带的ssl加密。所以我修改基于appspot的api的代码指向,把twitter.com改成dreamhost上支持oauth的api地址但是却无法使用。
    你能不能试试我这个想法是否可行,如果不能,有可能是什么原因呢?
    PS:基于gae的api有几个,使用gtap代码简单易于修改. http://code.google.com/p/gtap/

  105. May 16th, 2010 at 16:22 | #105
    Reply Quote

    @tianchaoren
    在GAE上安装了个支持 oauth的API,安装方法: http://timewilltell.me/2010/05/gaes-api-methods-built-oauth.html 我的API地址 https://heyfanzhg.appspot.com/ 这个是 from 推神 :razz:

  106. soho
    May 18th, 2010 at 09:44 | #106
    Reply Quote

    打开首页出错
    Warning: session_start() [function.session-start]: open(/tmp/sess_2fb2df2cf91131d50fa8f9f55eb7df89, O_RDWR) failed: Permission denied (13) in /home/XXX/public_html/twip3/twip.php on line 25

    Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at /home/XXX/public_html/twip3/twip.php:25) in /home/XXX/public_html/twip3/twip.php on line 25

    Welcome to Twip.

  107. May 18th, 2010 at 17:03 | #107
    Reply Quote

    晕 刚看到

    别把ff放上去,记得删掉 还有这条留言

  108. May 18th, 2010 at 18:42 | #108
    Reply Quote

    @Bronco
    test.php获取5推出错更好的排障方法是同时加载工作正常的api所获取的/statuses/public_timeline.xml和自己所获取的相同页面,然后比对一下看看有没有差异。

    BTW,发现Godaddy的免费主机可以正常搭建奶瓶腿客户端,但注册页面验证码显示不出来。用twip 3能在指定目录正常生成.oauth文件,然后用客户端可以正常登录,但不显示新推也不能发推。通过刚刚的方法查看了一下,果然是输出的xml文件由于被godaddy插入广告代码使得xml出错导致。。FML

    但不过还好twip还能用来直接按ID看推,算是发挥一点余热吧.. http://sharling.info/sharling

  109. May 18th, 2010 at 18:43 | #109
    Reply Quote
  110. May 18th, 2010 at 21:18 | #110
    Reply Quote

    @sharling
    免费空间确实比较讨厌……

    @Showfom
    改掉了,话说你直接在推上@我不就好了… :!:

    @soho
    空间对session支持有问题。收费主机的话提交给客服处理。

  111. May 19th, 2010 at 01:26 | #111
    Reply Quote

    屏蔽了Twitter的免费虚拟主机可以使用自己的顶级域名A记录指向Twitter,这样就可以绕过屏蔽域名。已经在byethost的主机上实验成功。OAuth验证成功后弄个二级域名指向twitter就可以了。不过这样做之后就不能再继续验证OAuth,只能继续使用原来已经注册的Oauth。 #twip

  112. May 19th, 2010 at 09:43 | #112
    Reply Quote

    http_code 401表示key和secret失效?请问这个怎么解决?

  113. May 19th, 2010 at 10:57 | #113
    Reply Quote

    我想问问 000webhost 支持不支持twip3

  114. May 19th, 2010 at 13:04 | #114
    Reply Quote

    @pipitu
    更换key和secret。若app被锁联系twitter。

    @blambin
    空间支持基本的session、mod_rewrite就ok的吧~屏蔽了twitter也可以通过域名转向来搞定。

  115. darasion
    May 19th, 2010 at 15:19 | #115
    Reply Quote

    @blambin
    看这里挺火爆的,我来凑个热闹,000webhost 好像不支持 .htaccess 的,搭了也没用,除非客户端支持非标准api url的。
    :arrow:

  116. redicaps
    May 20th, 2010 at 11:28 | #116
    Reply Quote

    原来不能用email登陆,让我昨天调试了半天…
    对twitter的api没有研究
    能够改变oauth文件的命名方式,使用登录方式而不是Screename来命名么?

  117. May 21st, 2010 at 17:44 | #117
    Reply Quote

    @darasion
    可以了已经 支持 .htaccess 的

  118. jukin
    May 21st, 2010 at 20:22 | #118
    Reply Quote

    byehost的主机不支持,早知道我就不浪费人家资源给申请了。为何楼主要加删除线???

  119. May 22nd, 2010 at 01:05 | #119
    Reply Quote

    nginx做的反向代理api在6月30号之后也会失效吗?
    我用twip在自己的VPS(nginx的)上面做,老是failed……无奈了
    如果反向代理还是可用的话那么就不准备折腾了……

  120. hmily
    May 23rd, 2010 at 13:09 | #120
    Reply Quote

    老大,我发现访问“api地址/statuses/public_timeline.xml”地址的时候,返回的是404页面,这是咋回事呢?

  121. May 23rd, 2010 at 20:53 | #121
    Reply Quote

    @jukin
    byehost可以通过使用域名A记录的方法来使用。具体可以去搜一下,在opda里有相关的教程。

    @camus
    反向代理应该是没什么问题的。

  122. ningye
    May 24th, 2010 at 13:08 | #122
    Reply Quote

    000webhost.com通过使用域名A记录的方法使用后,API密码保存,可是就是无法获取,郁闷.

  123. faint
    May 26th, 2010 at 12:53 | #123
    Reply Quote

    找了一个免费的空间,感觉很棒,但是有广告代码阻碍tweets显示
    请问有什么办法解决吗

  124. June 2nd, 2010 at 16:18 | #124
    Reply Quote

    同楼上,访问“api地址/statuses/public_timeline.xml”地址的时候,返回的是404页面

    用的是nginx,是不是要配置什么呢

  125. June 13th, 2010 at 12:17 | #125
    Reply Quote

    楼主,按照你说的已经架设好了,我的是付费空间。
    oauth目录下的xxx.oauth也生成了,但是每次点击sign in with twitter 在Save your OAuth token页面 输入2次API密码,就返回到Welcome to Twip页面,最后一行报Failed! 错误。 能分析下大概问题出在哪里吗? 地址 http://is.gd/cNjK0

  126. June 13th, 2010 at 22:13 | #126
    Reply Quote

    @minkaka
    返回之后可以点击”clean session”之后再点击”show your timeline”看看,或者在地址栏输入”api地址/statuses/public_timeline.xml”看看结果。

    @sun
    nginx依照.htaccess来配置服务器。

    @faint
    广告代码需要自己写代码来去掉,且有被关闭账户的可能。

  127. June 13th, 2010 at 23:36 | #127
    Reply Quote

    @minkaka
    返回之后可以点击”clean session”之后再点击”show your timeline”看看,或者在地址栏输入”api地址/statuses/public_timeline.xml”看看结果。
    ————————————————————————–
    点击 show your timeline 要我输入密码,究竟是什么用户名和密码啊,TWITTER帐户密码?前面设置的API密码?还是空间密码?FTp密码? ; twip目录下根本就没有/statuses/目录啊,更没有public_timeline.xml 文件~~~ 拜托帮忙看看。我在t上也给你留言了

  128. June 17th, 2010 at 09:09 | #128
    Reply Quote

    @@minkaka
    建议先仔细阅读相关的说明和教程。

  129. 31313
    June 23rd, 2010 at 14:21 | #129
    Reply Quote

    我的问题是
    gravity上除了搜索和趋势,都正常!
    为什么搜索没法用

  130. 刘德华
    June 23rd, 2010 at 21:03 | #130
    Reply Quote

    问个问题!6月30日后
    如果自建具有安全验证OAuth的api+6375
    应该还可以使用gravity吧?(也就是说twiter网站的改动不会对twip3与客户端的明码验证产生影响吧?)

    还有原作者架设的服务器不是用twip3吗?
    难道原作者的服务器可以两边(一边是twitter,另一边是客户端gravity)都支持验证OAuth?

    还有就是,目前最新的破解版本,没有输入自建api的位置了,通过什么办法可以继续使用自建api

    这几个问题困扰我很久了!望回答,谢谢!

  131. saraka
    June 29th, 2010 at 09:37 | #131
    Reply Quote

    @Bronco
    能不能直接给个链接,我隐藏路径转发然后还是显示连接不到twitter

  132. July 1st, 2010 at 17:06 | #132
    Reply Quote

    打开twip主页后出现

    Warning: require_once(include/twitteroauth.php) [function.require-once]: failed to open stream: Permission denied in /home/dofinein/public_html/twip/callback.php  on line 10
    
    Fatal error: require_once() [function.require]: Failed opening required 'include/twitteroauth.php' (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/dofinein/public_html/twip/callback.php on line 10

    请问是不是主机的问题?

  133. July 24th, 2010 at 15:59 | #133
    Reply Quote

    你好,博主,请教下. 我是在我自己的vps上搭建的twip, 点击Sign in Twitter 验证成功后,跳转到输入token access 密码,输入完跳转回主页,没有看到time_line 出现,只有一个 Fail , 但是保存oauth 信息的文件也已经正常的生成了。

    还有我在api后面加上statuses/public_timeline.xml 出现404错误 。

    请问我改怎么办呢?

  134. July 26th, 2010 at 20:56 | #134
    Reply Quote

    @刘德华
    6375版的可以用的,Gravity的作者用的应该不是twip而是他自己写的代理,因为只提供给Gravity自己用,所以接口可以随意设计。新版的Gravity不支持自定义api,要么等新版,要么降级。实在想用新版的可以建立一个statusnet类型的账号,只是这种方式不支持官方RT以及list,也无法推图。

    @saraka
    具体地址我这里也没有……

    @dofine
    看错误信息应该是权限设置的问题。

    @kun
    404错误的话检查webroot是否设置正确,.htaccess是否存在且正确。非Apache服务器的话需要自己实现rewrite。

  135. July 26th, 2010 at 23:02 | #135
    Reply Quote

    感谢。。已经解决了,是apache 忘了加载mod_rewrite 模块了。

  136. 刘德华
    August 3rd, 2010 at 18:22 | #136
    Reply Quote

    谢了!继续twitter

  137. August 11th, 2010 at 19:12 | #137
    Reply Quote

    这个真是不容易啊,复杂

  138. Lionel
    August 20th, 2010 at 14:35 | #138
    Reply Quote

    @Bronco 你好,我在dh的空间(api.8cmblue.tk)上搭建了Twip3.1,oauth文件夹里也生成了.oauth文件了,权限也设置为了777,但就是一直显示“Fail”。含泪求指教。 :cry:

  139. Lionel
    August 21st, 2010 at 12:55 | #139
    Reply Quote

    搞定了,用二级域名直接访问API时,webroot需要设置为“/”。

  140. August 22nd, 2010 at 15:33 | #140
    Reply Quote

    啊哦!这个我抽时间试试!

  141. August 26th, 2010 at 01:19 | #141
    Reply Quote

    悲剧,最后一步输入API密码后,提示

    Warning: file_put_contents(/home/user/oauth/gaochuyu.oauth) [function.file-put-contents]: failed to open stream: No such file or directory in /home/content/g/a/o/gaochuyu/html/t/api/savetoken.php on line 30

    Warning: Cannot modify header information – headers already sent by (output started at /home/content/g/a/o/gaochuyu/html/t/api/savetoken.php:30) in /home/content/g/a/o/gaochuyu/html/t/api/savetoken.php on line 32

    求解

  142. September 1st, 2010 at 16:42 | #142
    Reply Quote

    通过web访问已经可以得到tweet了,而且connection页面也有授权了,但是在twhirl中用api的方式却无法操作。btw:twhirl中api访问的形式是 用户名为name@apiaddress的形式l.ca帐号是不是因为这个问题?

  143. 良柄
    September 1st, 2010 at 22:24 | #143
    Reply Quote

    我到倒数第二步的时候,没有出现到官网的认证,而是直接跳转到设置密码页面了,这是怎么回事?而且这里设置密码完成之后跳转回Twip页面,每次都显示Failed,晕死~折腾一宿了还是搞不定,太郁闷了

  144. September 1st, 2010 at 23:52 | #144
    Reply Quote

    哈哈,看完文章,看到域名才知道是你~~ :grin:

  145. September 2nd, 2010 at 09:28 | #145
    Reply Quote

    @良柄
    没有官网验证是因为之前曾经登陆过,并且做过了允许操作。至于显示Fail,先看有没有oauth文件,再通过网址的形式检查api是否工作正常。具体方法之前的评论中有。

    @Jutoy
    嘿嘿~~ :cool:

  146. December 27th, 2010 at 16:38 | #146
    Reply Quote

    博主,好久没更新了

  147. January 5th, 2011 at 09:31 | #147
    Reply Quote

    博主,N久没更新了哦!~~

  148. January 27th, 2011 at 13:46 | #148
    Reply Quote

    博主好久没更新了吧!~~~~

  149. March 14th, 2011 at 16:11 | #149
    Reply Quote

    好多人哦……博主去哪了呢

  150. March 21st, 2011 at 13:26 | #150
    Reply Quote

    博主人气好旺哦,你还不快带那更新啊。。。

  151. March 27th, 2011 at 01:06 | #151
    Reply Quote

    非常好的博客 过来跟博主学习了

  152. March 27th, 2011 at 16:24 | #152
    Reply Quote

    我记得我见过这个主题
    很不错的主题 银河的

  153. WILDEN气动隔膜泵
    April 15th, 2011 at 13:51 | #153
    Reply Quote

    我说难怪这么多人,原来已经快一年了的文章呀。博主你看看这么多人来支持你,你也不出来……

  1. [...] http://heybronco.net/tech/twitter/the-twip-support-oauth/ 本人淘宝店提供的DREAMHOST [...]

  2. [...] 支持OAuth的Twip – 信马由缰 (tags: OAuth TwitterTools) [...]

  3. [...] 凡是GFW禁止的,我就有尝试的兴趣。所以最近就一直尝试搭建自己的twitter api proxy。proxy程序有基于Google App Engine的birdnest,基于PHP的twip。 [...]

  4. May 26th, 2010 at 00:25 | #6

    [...] 五月 26, 2010 作者为 xijie 作者:Bronco  来源:http://heybronco.net/tech/twitter/the-twip-support-oauth/ [...]

  5. September 3rd, 2010 at 00:53 | #7

    [...] 支持OAuth的Twip [...]

  6. August 18th, 2011 at 20:18 | #8

    [...] address of this article is http://heybronco.net/tech/twitter/the-twip-support-oauth/.When you got this here have more than 30 comments. Why not come to check it [...]

Comments feed