Просмотр исходного кода

Specify user agent in headers like in squawker

Yuchen Pei 1 год назад
Родитель
Сommit
77039a0a05
1 измененных файлов с 108 добавлено и 121 удалено
  1. 108 121
      exitter.el

+ 108 - 121
exitter.el

@@ -28,12 +28,12 @@
       (format "%s/onboarding/task.json" exitter-url-endpoint)
       exitter-url-token
       (format "https://api.twitter.com/oauth2/token"))
-(setq exitter-agent-param "-A \"TwitterAndroid/10.10.0\"")
-(setq exitter-tor-param "-x socks5://127.0.0.1:9150/")
+(setq exitter-tor-param "-x socks5://127.0.0.1:9050/")
 (setq exitter-init-headers
       `(
         ("Content-Type" . "application/json")
         ("User-Agent" . "TwitterAndroid/10.10.0 (29950000-r-0) ONEPLUS+A3010/9 (OnePlus;ONEPLUS+A3010;OnePlus;OnePlus3;0;;1;2016)")
+        ;; ("User-Agent" . "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36")
         ("X-Twitter-API-Version" . "5")
         ("X-Twitter-Client" . "TwitterAndroid")
         ("X-Twitter-Client-Version" . "10.10.0")
@@ -55,8 +55,7 @@
 ;; (setq request-message-level -1)
 
 (defun exitter-get-access-token ()
-  (let ((request-curl-options `(,exitter-agent-param))
-        (oauth-consumer-key-secret
+  (let ((oauth-consumer-key-secret
          (base64-encode-string
           (format "%s:%s" exitter-oauth-consumer-key
                   exitter-oauth-consumer-secret)
@@ -80,27 +79,28 @@
 
 (defun exitter-get-guest-token ()
   (message "entering exitter-get-guest-token")
-  (let ((request-curl-options `(,exitter-agent-param)))
-    (request exitter-url-activate
-      :headers `(("Authorization" . ,(format "Bearer %s" exitter-access-token)))
-      :parser 'json-read
-      :type "POST"
-      :success (cl-function
-                (lambda (&key data &allow-other-keys)
-                  (exitter-get-flow-token (alist-get 'guest_token data))))
-      :error
-      (cl-function (lambda (&rest args &key error-thrown &allow-other-keys)
-                     (message "Got error: %S" error-thrown)))
-      )))
-
-(defun exitter-get-flow-token (guest-token)
-  (message "entering exitter-get-flow-token")
-  (let ((request-curl-options `(,exitter-agent-param)))
+  (request exitter-url-activate
+    :headers `(("Authorization" . ,(format "Bearer %s" exitter-access-token)))
+    :parser 'json-read
+    :type "POST"
+    :success (cl-function
+              (lambda (&key data &allow-other-keys)
+                (exitter-login-flow-token (alist-get 'guest_token data))))
+    :error
+    (cl-function (lambda (&rest args &key error-thrown &allow-other-keys)
+                   (message "Got error: %S" error-thrown)))
+    ))
+
+(defun exitter-login-flow-token (guest-token)
+  (message "entering exitter-login-flow-token")
+  (let ((headers `(,@exitter-init-headers
+                   ("Authorization" . ,(format "Bearer %s" exitter-access-token))
+                   ("X-Guest-Token" . ,guest-token)
+                   )))
     (request exitter-url-task
-      :param '(("flow_name" . "login"))
-      :headers `(("Authorization" . ,(format "Bearer %s" exitter-access-token))
-                 ("Content-type" . "application/json")
-                 ("X-Guest-Token" . ,guest-token))
+      :params '(("flow_name" . "login")
+                ("lang" . "en"))
+      :headers headers
       :data (json-encode
              '(("flow_token" . nil)
                ("input_flow_data" .
@@ -117,20 +117,23 @@
       :type "POST"
       :complete (cl-function
                  (lambda (&key response &allow-other-keys)
-                   (let ((att
-                          (request-response-header response "att"))
-                         (data
-                          (request-response-data response)))
+                   (let* ((att
+                           (request-response-header response "att"))
+                          (data
+                           (request-response-data response))
+                          (flow-token (alist-get 'flow_token data)))
                      (unless (exitter-find-subtask data "LoginEnterUserIdentifier")
                        (error "Subtask LoginEnterUserIdentifier not found"))
                      ;; (pp data)
                      ;; (message "flow-token: %s\natt: %s"
                      ;;          (alist-get 'flow_token data)
                      ;;          att)
-                     (exitter-enter-username guest-token
-                                             (alist-get 'flow_token data)
-                                             att)
-                     )))
+                     (when att
+                       (setq headers
+                             `(,@headers
+                               ("att" . ,att)
+                               ("cookie" . ,(format "att=%s" att)))))
+                     (exitter-enter-username flow-token headers))))
       :error
       (cl-function (lambda (&rest args &key error-thrown &allow-other-keys)
                      (message "Got error: %S" error-thrown)))
@@ -147,97 +150,81 @@
 (defun exitter-report-error (&rest args &key error-thrown &allow-other-keys)
   (message "Got error: %S" error-thrown))
 
-(defun exitter-enter-username (guest-token flow-token att)
+(defun exitter-enter-username (flow-token headers)
   (message "entering exitter-enter-username")
-  (let ((request-curl-options `(,exitter-agent-param)))
-    (request exitter-url-task
-      :params '(("lang" . "en"))
-      :headers `(("Authorization" . ,(format "Bearer %s" exitter-access-token))
-                 ("Content-type" . "application/json")
-                 ("X-Guest-Token" . ,guest-token)
-                 ("att" . ,att)
-                 ("cookie" . ,(format "att=%s" att)))
-      :data (json-encode
-             `(("flow_token" . ,flow-token)
-               ("subtask_inputs" .
-                [(("enter_text" .
-                   (("suggestion_id" . nil)
-                    ("text" . ,exitter-username)
-                    ("link" . "next_link")))
-                  ("subtask_id" . "LoginEnterUserIdentifier"))])))
-      :type "POST"
-      :parser 'json-read
-      :success (cl-function
-                (lambda (&key data &allow-other-keys)
-                  (cond
-                   ((exitter-find-subtask data "LoginEnterPassword")
-                    (message "LoginEnterPassword")
-                    (exitter-enter-password guest-token flow-token att))
-                   ((exitter-find-subtask data "LoginEnterAlternateIdentifierSubtask")
-                    (message "LoginEnterAlternateIdentifierSubtask")
-                    (exitter-enter-email guest-token flow-token att))
-                   (t (message "Cannot find any matching subtasks")))
-                  ))
-      :error
-      (cl-function (lambda (&rest args &key error-thrown &allow-other-keys)
-                     (message "Got error: %S" error-thrown)))
-      )))
-
-
-(defun exitter-enter-password (guest-token flow-token att)
+  (request exitter-url-task
+    :params '(("lang" . "en"))
+    :headers headers
+    :data (json-encode
+           `(("flow_token" . ,flow-token)
+             ("subtask_inputs" .
+              [(("enter_text" .
+                 (("suggestion_id" . nil)
+                  ("text" . ,exitter-username)
+                  ("link" . "next_link")))
+                ("subtask_id" . "LoginEnterUserIdentifier"))])))
+    :type "POST"
+    :parser 'json-read
+    :success (cl-function
+              (lambda (&key data &allow-other-keys)
+                (cond
+                 ((exitter-find-subtask data "LoginEnterPassword")
+                  (message "LoginEnterPassword")
+                  (exitter-enter-password flow-token headers))
+                 ((exitter-find-subtask data "LoginEnterAlternateIdentifierSubtask")
+                  (message "LoginEnterAlternateIdentifierSubtask")
+                  (exitter-enter-email flow-token headers))
+                 (t (message "Cannot find any matching subtasks")))
+                ))
+    :error
+    (cl-function (lambda (&rest args &key error-thrown &allow-other-keys)
+                   (message "Got error: %S" error-thrown)))))
+
+
+(defun exitter-enter-password (flow-token headers)
   (message "entering exitter-enter-password")
-  (let ((request-curl-options `(,exitter-agent-param)))
-    (request exitter-url-task
-      :params '(("lang" . "en"))
-      :headers `(("Authorization" . ,(format "Bearer %s" exitter-access-token))
-                 ("Content-type" . "application/json")
-                 ("X-Guest-Token" . ,guest-token)
-                 ("att" . ,att)
-                 ("cookie" . ,(format "att=%s" att)))
-      :data (json-encode
-             `(("flow_token" . ,flow-token)
-               ("subtask_inputs" .
-                [(("enter_password" .
-                   (("password" . ,exitter-password)
-                    ("link" . "next_link")))
-                  ("subtask_id" . "LoginEnterPassword"))])))
-      :type "POST"
-      :parser 'json-read
-      :success (cl-function
-                (lambda (&key data &allow-other-keys)
-                  (print data)
-                  ))
-      :error
-      (cl-function (lambda (&rest args &key error-thrown &allow-other-keys)
-                     (message "Got error: %S" error-thrown)))
-      )))
-
-(defun exitter-enter-email (guest-token flow-token att)
+  (request exitter-url-task
+    :params '(("lang" . "en"))
+    :headers headers
+    :data (json-encode
+           `(("flow_token" . ,flow-token)
+             ("subtask_inputs" .
+              [(("enter_password" .
+                 (("password" . ,exitter-password)
+                  ("link" . "next_link")))
+                ("subtask_id" . "LoginEnterPassword"))])))
+    :type "POST"
+    :parser 'json-read
+    :success (cl-function
+              (lambda (&key data &allow-other-keys)
+                (print data)
+                ))
+    :error
+    (cl-function (lambda (&rest args &key error-thrown &allow-other-keys)
+                   (message "Got error: %S" error-thrown)))
+    ))
+
+(defun exitter-enter-email (flow-token headers)
   (message "entering exitter-enter-email")
-  (let ((request-curl-options `(,exitter-agent-param)))
-    (request exitter-url-task
-      :params '(("lang" . "en"))
-      :headers `(("Authorization" . ,(format "Bearer %s" exitter-access-token))
-                 ("Content-type" . "application/json")
-                 ("X-Guest-Token" . ,guest-token)
-                 ("att" . ,att)
-                 ("cookie" . ,(format "att=%s" att)))
-      :data (json-encode
-             `(("flow_token" . ,flow-token)
-               ("subtask_inputs" .
-                [(("enter_text" .
-                   (("text" . ,exitter-email)
-                    ("link" . "next_link")))
-                  ("subtask_id" . "LoginEnterAlternateIdentifierSubtask"))])))
-      :type "POST"
-      :parser 'json-read
-      :success (cl-function
-                (lambda (&key data &allow-other-keys)
-                  (print data)
-                  ))
-      :error
-      (cl-function (lambda (&rest args &key error-thrown &allow-other-keys)
-                     (message "Got error: %S" error-thrown)))
-      )))
+  (request exitter-url-task
+    :params '(("lang" . "en"))
+    :headers headers
+    :data (json-encode
+           `(("flow_token" . ,flow-token)
+             ("subtask_inputs" .
+              [(("enter_text" .
+                 (("text" . ,exitter-email)
+                  ("link" . "next_link")))
+                ("subtask_id" . "LoginEnterAlternateIdentifierSubtask"))])))
+    :type "POST"
+    :parser 'json-read
+    :success (cl-function
+              (lambda (&key data &allow-other-keys)
+                (print data)
+                ))
+    :error
+    (cl-function (lambda (&rest args &key error-thrown &allow-other-keys)
+                   (message "Got error: %S" error-thrown)))
+    ))
 
 (provide 'exitter)