/* Facebook plugin for Miranda Instant Messenger _____________________________________________ Copyright © 2011-17 Robert Pösel This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef _FACEBOOK_REQUEST_UTILS_H_ #define _FACEBOOK_REQUEST_UTILS_H_ // refreshing captcha dialog (changing captcha type) class RefreshCaptchaRequest : public HttpRequest { public: RefreshCaptchaRequest(facebook_client *fc, const char *captchaPersistData) : HttpRequest(REQUEST_GET, FACEBOOK_SERVER_REGULAR "/captcha/refresh_ajax.php") { Url << "__a=1" << "new_captcha_type=TFBCaptcha" << CHAR_VALUE("skipped_captcha_data", captchaPersistData) << CHAR_VALUE("__dyn", fc->__dyn()) << CHAR_VALUE("__req", fc->__req()) << CHAR_VALUE("__rev", fc->__rev()) << CHAR_VALUE("__user", fc->self_.user_id.c_str()); } }; // getting data for given url (for sending/posting reasons) class LinkScraperRequest : public HttpRequest { public: LinkScraperRequest(facebook_client *fc, status_data *status) : HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/composerx/attachment/link/scraper/") { Url << "__a=1" << "composerurihash=2" << CHAR_VALUE("scrape_url", ptrA(mir_urlEncode(status->url.c_str()))); Body << CHAR_VALUE("fb_dtsg", fc->dtsg_.c_str()) << CHAR_VALUE("targetid", status->user_id.empty() ? fc->self_.user_id.c_str() : status->user_id.c_str()) << CHAR_VALUE("xhpc_targetid", status->user_id.empty() ? fc->self_.user_id.c_str() : status->user_id.c_str()) << "istimeline=1" << "composercontext=composer" << "onecolumn=1" << "nctr[_mod]=pagelet_timeline_recent" << "__a=1" << CHAR_VALUE("ttstamp", fc->ttstamp_.c_str()) << CHAR_VALUE("__user", status->isPage && !status->user_id.empty() ? status->user_id.c_str() : fc->self_.user_id.c_str()) << "loaded_components[0]=maininput" << "loaded_components[1]=backdateicon" << "loaded_components[2]=withtaggericon" << "loaded_components[3]=cameraicon" << "loaded_components[4]=placetaggericon" << "loaded_components[5]=mainprivacywidget" << "loaded_components[6]=withtaggericon" << "loaded_components[7]=backdateicon" << "loaded_components[8]=placetaggericon" << "loaded_components[9]=cameraicon" << "loaded_components[10]=mainprivacywidget" << "loaded_components[11]=maininput" << "loaded_components[12]=explicitplaceinput" << "loaded_components[13]=hiddenplaceinput" << "loaded_components[14]=placenameinput" << "loaded_components[15]=hiddensessionid" << "loaded_components[16]=withtagger" << "loaded_components[17]=backdatepicker" << "loaded_components[18]=placetagger" << "loaded_components[19]=citysharericon"; } }; // getting owned/admined pages list class GetPagesRequest : public HttpRequest { public: GetPagesRequest() : HttpRequest(REQUEST_GET, FACEBOOK_SERVER_REGULAR "/bookmarks/pages") { } }; // changing identity to post status for pages class SwitchIdentityRequest : public HttpRequest { public: SwitchIdentityRequest(const char *dtsg, const char *userId) : HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/identity_switch.php") { Url << "__a=1"; Body << CHAR_VALUE("fb_dtsg", dtsg) << CHAR_VALUE("user_id", userId) << CHAR_VALUE("url", FACEBOOK_URL_HOMEPAGE); } }; // posting status to our or friends's wall class SharePostRequest : public HttpRequest { public: SharePostRequest(facebook_client *fc, status_data *status, const char *linkData) : HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/ajax/updatestatus.php") { Url << "__a=1"; ptrA text(mir_urlEncode(status->text.c_str())); Body << CHAR_VALUE("fb_dtsg", fc->dtsg_.c_str()) << CHAR_VALUE("__dyn", fc->__dyn()) << CHAR_VALUE("__req", fc->__req()) << CHAR_VALUE("ttstamp", fc->ttstamp_.c_str()) << CHAR_VALUE("__user", status->isPage && !status->user_id.empty() ? status->user_id.c_str() : fc->self_.user_id.c_str()) << CHAR_VALUE("xhpc_targetid", status->user_id.empty() ? fc->self_.user_id.c_str() : status->user_id.c_str()) << CHAR_VALUE("xhpc_message", text) << CHAR_VALUE("xhpc_message_text", text) << "xhpc_context=profile" << "xhpc_ismeta=1" << "xhpc_timeline=1" << "xhpc_composerid=u_0_2y" << "is_explicit_place=" << "composertags_place=" << "composertags_city=" << "composer_session_id=" << "composer_predicted_city=" << "disable_location_sharing=false" << "nctr[_mod]=pagelet_composer"; if (!status->isPage) { Body << CHAR_VALUE("audience[0][value]", fc->get_privacy_type().c_str()); } if (!status->place.empty()) { Body << CHAR_VALUE("composertags_place_name", ptrA(mir_urlEncode(status->place.c_str()))); } // Status with users for (std::vector::size_type i = 0; i < status->users.size(); i++) { CMStringA withId(::FORMAT, "composertags_with[%i]", i); CMStringA withName(::FORMAT, "text_composertags_with[%i]", i); Body << CHAR_VALUE(withId.c_str(), status->users[i]->user_id.c_str()) << CHAR_VALUE(withName.c_str(), status->users[i]->real_name.c_str()); } // Link attachment if (mir_strlen(linkData) > 0) { Body << linkData; // << "no_picture=0" // for disabling link preview image } } }; // sending pokes class SendPokeRequest : public HttpRequest { public: SendPokeRequest(facebook_client *fc, const char *userId) : HttpRequest(REQUEST_POST, FACEBOOK_SERVER_REGULAR "/pokes/dialog/") { Url << "__a=1"; Body << "do_confirm=0" << CHAR_VALUE("poke_target", userId) << CHAR_VALUE("fb_dtsg", fc->dtsg_.c_str()) << CHAR_VALUE("__user", fc->self_.user_id.c_str()) << CHAR_VALUE("ttstamp", fc->ttstamp_.c_str()); } }; #endif //_FACEBOOK_REQUEST_UTILS_H_