twitter.erl 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. -module(twitter).
  2. -author('Andrii Zadorozhnii').
  3. -include_lib("n2o/include/wf.hrl").
  4. -include_lib("avz/include/avz.hrl").
  5. -include_lib("kvs/include/user.hrl").
  6. -compile(export_all).
  7. -export(?API).
  8. -define(CONSUMER_KEY, application:get_env(web, tw_consumer_key, [])).
  9. -define(CONSUMER_SECRET, application:get_env(web, tw_consumer_secret, [])).
  10. -define(CONSUMER, {?CONSUMER_KEY, ?CONSUMER_SECRET, hmac_sha1}).
  11. registration_data(Props, twitter, Ori)->
  12. Id = proplists:get_value(<<"id_str">>, Props),
  13. UserName = binary_to_list(proplists:get_value(<<"screen_name">>, Props)),
  14. Email = email_prop(Props,twitter),
  15. Ori#user{ id = Email,
  16. username = re:replace(UserName, "\\.", "_", [{return, list}]),
  17. display_name = proplists:get_value(<<"screen_name">>, Props),
  18. images = avz:update({tw_avatar,proplists:get_value(<<"profile_image_url">>, Props)},Ori#user.images),
  19. names = proplists:get_value(<<"name">>, Props),
  20. email = Email,
  21. surnames = [],
  22. tokens = avz:update({twitter,Id},Ori#user.tokens),
  23. register_date = os:timestamp(),
  24. status = ok }.
  25. email_prop(Props, twitter) -> proplists:get_value(<<"screen_name">>, Props).
  26. callback() ->
  27. Token = wf:q(<<"oauth_token">>),
  28. Verifier = wf:q(<<"oauth_verifier">>),
  29. case wf:user() of
  30. undefined ->
  31. if (Token /= undefined) andalso ( Verifier/= undefined) ->
  32. case get_access_token(binary_to_list(Token), binary_to_list(Verifier)) of
  33. not_authorized -> skip;
  34. Props -> UserData = show(Props), avz:login(twitter, UserData#struct.lst) end;
  35. true -> skip end;
  36. _ -> skip end.
  37. login_button() -> application:get_env(avz,twitter_button,#panel{class=["btn-group"], body=
  38. #link{id=twlogin, class=[btn, "btn-info", "btn-large", "btn-lg"],
  39. body=[#i{class=[fa,"fa-twitter","fa-lg","icon-twitter", "icon-large"]}, <<"Twitter">>],
  40. postback={twitter,logintwitter}}}).
  41. sdk() -> [].
  42. api_event(_,_,_) -> ok.
  43. event({twitter,logintwitter}) ->
  44. case get_request_token() of
  45. {RequestToken, _, _} -> wf:redirect(authenticate_url(RequestToken));
  46. {error, R} -> wf:info(?MODULE, "Twitter request failed:", [R]), [] end.
  47. get_request_token()->
  48. URL = "https://api.twitter.com/oauth/request_token",
  49. case oauth:get(URL, [], ?CONSUMER) of
  50. {ok, Response} ->
  51. Params = oauth:params_decode(Response),
  52. RequestToken = oauth:token(Params),
  53. RequestTokenSecret = oauth:token_secret(Params),
  54. CallbackConfirmed = proplists:get_value("oauth_callback_confirmed", Params),
  55. {RequestToken, RequestTokenSecret, CallbackConfirmed};
  56. {error, E}-> {error, E}
  57. end.
  58. get_access_token(undefined, undefined)-> not_authorized;
  59. get_access_token(undefined, _)-> not_authorized;
  60. get_access_token(_, undefined)-> not_authorized;
  61. get_access_token(Token, Verifier)->
  62. URL = "https://api.twitter.com/oauth/access_token",
  63. Signed = oauth:sign("GET", URL, [{"oauth_verifier", Verifier}], ?CONSUMER, Token, ""),
  64. {OauthParams, QueryParams} = lists:partition(fun({K, _}) -> lists:prefix("oauth_", K) end, Signed),
  65. Request = {oauth:uri(URL, QueryParams), [oauth:header(OauthParams)]},
  66. {ok, Response} = httpc:request(get, Request, [{autoredirect, false}], []),
  67. case Response of
  68. {HttpResponse, _, _}->
  69. case HttpResponse of
  70. {"HTTP/1.1",200,"OK"}->
  71. Params = oauth:params_decode(Response),
  72. Params;
  73. _ -> not_authorized
  74. end;
  75. _ -> not_authorized
  76. end.
  77. authenticate_url(RequestToken)->
  78. oauth:uri("https://api.twitter.com/oauth/authenticate", [{"oauth_token", RequestToken}]).
  79. authorize_url(RequestToken)->
  80. oauth:uri("https://api.twitter.com/oauth/authorize", [{"oauth_token", RequestToken}]).
  81. show(Props)->
  82. URI = "https://api.twitter.com/1.1/users/show.json",
  83. {ok, Response} = oauth:get(URI, [{"user_id", proplists:get_value("user_id", Props)},
  84. {"include_entities", false}],
  85. ?CONSUMER, oauth:token(Props), oauth:token_secret(Props)),
  86. case Response of
  87. {HttpResponse, _, Body} -> case HttpResponse of
  88. {"HTTP/1.1", 200, "OK"} -> n2o_json:decode(Body);
  89. _-> error end;
  90. _ -> error
  91. end.