@book000/twitterts 0.49.6 → 0.52.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/converter.d.ts +0 -45
- package/dist/converter.d.ts.map +1 -1
- package/dist/converter.js +0 -51
- package/dist/converter.js.map +1 -1
- package/dist/generate-types/custom-types-generator.d.ts +6 -45
- package/dist/generate-types/custom-types-generator.d.ts.map +1 -1
- package/dist/generate-types/custom-types-generator.js +299 -385
- package/dist/generate-types/custom-types-generator.js.map +1 -1
- package/dist/generate-types/endpoint-type-generator.d.ts +11 -60
- package/dist/generate-types/endpoint-type-generator.d.ts.map +1 -1
- package/dist/generate-types/endpoint-type-generator.js +54 -94
- package/dist/generate-types/endpoint-type-generator.js.map +1 -1
- package/dist/generate-types/types-generator.d.ts +3 -36
- package/dist/generate-types/types-generator.d.ts.map +1 -1
- package/dist/generate-types/types-generator.js +40 -40
- package/dist/generate-types/types-generator.js.map +1 -1
- package/dist/generate-types/utils.d.ts +0 -94
- package/dist/generate-types/utils.d.ts.map +1 -1
- package/dist/generate-types/utils.js +0 -168
- package/dist/generate-types/utils.js.map +1 -1
- package/dist/generate-types.js +16 -6
- package/dist/generate-types.js.map +1 -1
- package/dist/migrate-saved-response.d.ts +2 -0
- package/dist/migrate-saved-response.d.ts.map +1 -0
- package/dist/migrate-saved-response.js +178 -0
- package/dist/migrate-saved-response.js.map +1 -0
- package/dist/models/exceptions.d.ts +0 -33
- package/dist/models/exceptions.d.ts.map +1 -1
- package/dist/models/exceptions.js +0 -33
- package/dist/models/exceptions.js.map +1 -1
- package/dist/models/responses/custom/custom-graph-qltimeline-success-response.d.ts +0 -1
- package/dist/models/responses/custom/custom-graph-qltimeline-success-response.d.ts.map +1 -1
- package/dist/models/responses/custom/custom-graph-qltimeline-success-response.js +0 -1
- package/dist/models/responses/custom/custom-graph-qltimeline-success-response.js.map +1 -1
- package/dist/models/responses/custom/custom-search-timeline-entry.d.ts +0 -1
- package/dist/models/responses/custom/custom-search-timeline-entry.d.ts.map +1 -1
- package/dist/models/responses/custom/custom-search-timeline-entry.js +0 -1
- package/dist/models/responses/custom/custom-search-timeline-entry.js.map +1 -1
- package/dist/models/responses/custom/custom-timeline-tweet-entry.d.ts +0 -1
- package/dist/models/responses/custom/custom-timeline-tweet-entry.d.ts.map +1 -1
- package/dist/models/responses/custom/custom-timeline-tweet-entry.js +0 -1
- package/dist/models/responses/custom/custom-timeline-tweet-entry.js.map +1 -1
- package/dist/models/responses/custom/custom-tweet-legacy-object.d.ts +0 -1
- package/dist/models/responses/custom/custom-tweet-legacy-object.d.ts.map +1 -1
- package/dist/models/responses/custom/custom-tweet-legacy-object.js +0 -1
- package/dist/models/responses/custom/custom-tweet-legacy-object.js.map +1 -1
- package/dist/models/responses/custom/custom-tweet-object.d.ts +0 -1
- package/dist/models/responses/custom/custom-tweet-object.d.ts.map +1 -1
- package/dist/models/responses/custom/custom-tweet-object.js +0 -1
- package/dist/models/responses/custom/custom-tweet-object.js.map +1 -1
- package/dist/models/responses/custom/custom-user-legacy-object.d.ts +0 -1
- package/dist/models/responses/custom/custom-user-legacy-object.d.ts.map +1 -1
- package/dist/models/responses/custom/custom-user-legacy-object.js +0 -1
- package/dist/models/responses/custom/custom-user-legacy-object.js.map +1 -1
- package/dist/models/responses/custom/custom-user-like-tweet-entry.d.ts +0 -1
- package/dist/models/responses/custom/custom-user-like-tweet-entry.d.ts.map +1 -1
- package/dist/models/responses/custom/custom-user-like-tweet-entry.js +0 -1
- package/dist/models/responses/custom/custom-user-like-tweet-entry.js.map +1 -1
- package/dist/models/responses/custom/custom-user-tweet-entry.d.ts +0 -1
- package/dist/models/responses/custom/custom-user-tweet-entry.d.ts.map +1 -1
- package/dist/models/responses/custom/custom-user-tweet-entry.js +0 -1
- package/dist/models/responses/custom/custom-user-tweet-entry.js.map +1 -1
- package/dist/models/responses/endpoints.d.ts +0 -29
- package/dist/models/responses/endpoints.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/article-nudge-domains-error.d.ts +0 -1
- package/dist/models/responses/graphql/get/article-nudge-domains-error.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/article-nudge-domains-error.js +0 -1
- package/dist/models/responses/graphql/get/article-nudge-domains-error.js.map +1 -1
- package/dist/models/responses/graphql/get/article-nudge-domains-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/article-nudge-domains-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/article-nudge-domains-success.js +0 -1
- package/dist/models/responses/graphql/get/article-nudge-domains-success.js.map +1 -1
- package/dist/models/responses/graphql/get/audio-space-by-id-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/audio-space-by-id-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/audio-space-by-id-success.js +0 -1
- package/dist/models/responses/graphql/get/audio-space-by-id-success.js.map +1 -1
- package/dist/models/responses/graphql/get/authenticated-user-tflists-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/authenticated-user-tflists-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/authenticated-user-tflists-success.js +0 -1
- package/dist/models/responses/graphql/get/authenticated-user-tflists-success.js.map +1 -1
- package/dist/models/responses/graphql/get/bookmarks-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/bookmarks-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/bookmarks-success.js +0 -1
- package/dist/models/responses/graphql/get/bookmarks-success.js.map +1 -1
- package/dist/models/responses/graphql/get/communities-tab-bar-item-query-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/communities-tab-bar-item-query-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/communities-tab-bar-item-query-success.js +0 -1
- package/dist/models/responses/graphql/get/communities-tab-bar-item-query-success.js.map +1 -1
- package/dist/models/responses/graphql/get/connect-tab-timeline-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/connect-tab-timeline-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/connect-tab-timeline-success.js +0 -1
- package/dist/models/responses/graphql/get/connect-tab-timeline-success.js.map +1 -1
- package/dist/models/responses/graphql/get/data-saver-mode-error.d.ts +0 -1
- package/dist/models/responses/graphql/get/data-saver-mode-error.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/data-saver-mode-error.js +0 -1
- package/dist/models/responses/graphql/get/data-saver-mode-error.js.map +1 -1
- package/dist/models/responses/graphql/get/data-saver-mode-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/data-saver-mode-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/data-saver-mode-success.js +0 -1
- package/dist/models/responses/graphql/get/data-saver-mode-success.js.map +1 -1
- package/dist/models/responses/graphql/get/dmpinned-inbox-query-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/dmpinned-inbox-query-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/dmpinned-inbox-query-success.js +0 -1
- package/dist/models/responses/graphql/get/dmpinned-inbox-query-success.js.map +1 -1
- package/dist/models/responses/graphql/get/follow-host-button-query-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/follow-host-button-query-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/follow-host-button-query-success.js +0 -1
- package/dist/models/responses/graphql/get/follow-host-button-query-success.js.map +1 -1
- package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-error.d.ts +0 -1
- package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-error.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-error.js +0 -1
- package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-error.js.map +1 -1
- package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-success.js +0 -1
- package/dist/models/responses/graphql/get/get-alt-text-prompt-preference-success.js.map +1 -1
- package/dist/models/responses/graphql/get/get-user-claims-error.d.ts +0 -1
- package/dist/models/responses/graphql/get/get-user-claims-error.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/get-user-claims-error.js +0 -1
- package/dist/models/responses/graphql/get/get-user-claims-error.js.map +1 -1
- package/dist/models/responses/graphql/get/get-user-claims-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/get-user-claims-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/get-user-claims-success.js +0 -1
- package/dist/models/responses/graphql/get/get-user-claims-success.js.map +1 -1
- package/dist/models/responses/graphql/get/home-latest-timeline-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/home-latest-timeline-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/home-latest-timeline-success.js +0 -1
- package/dist/models/responses/graphql/get/home-latest-timeline-success.js.map +1 -1
- package/dist/models/responses/graphql/get/home-timeline-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/home-timeline-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/home-timeline-success.js +0 -1
- package/dist/models/responses/graphql/get/home-timeline-success.js.map +1 -1
- package/dist/models/responses/graphql/get/likes-error.d.ts +0 -1
- package/dist/models/responses/graphql/get/likes-error.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/likes-error.js +0 -1
- package/dist/models/responses/graphql/get/likes-error.js.map +1 -1
- package/dist/models/responses/graphql/get/likes-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/likes-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/likes-success.js +0 -1
- package/dist/models/responses/graphql/get/likes-success.js.map +1 -1
- package/dist/models/responses/graphql/get/list-latest-tweets-timeline-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/list-latest-tweets-timeline-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/list-latest-tweets-timeline-success.js +0 -1
- package/dist/models/responses/graphql/get/list-latest-tweets-timeline-success.js.map +1 -1
- package/dist/models/responses/graphql/get/list-pins-error.d.ts +0 -1
- package/dist/models/responses/graphql/get/list-pins-error.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/list-pins-error.js +0 -1
- package/dist/models/responses/graphql/get/list-pins-error.js.map +1 -1
- package/dist/models/responses/graphql/get/list-pins-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/list-pins-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/list-pins-success.js +0 -1
- package/dist/models/responses/graphql/get/list-pins-success.js.map +1 -1
- package/dist/models/responses/graphql/get/lists-management-page-timeline-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/lists-management-page-timeline-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/lists-management-page-timeline-success.js +0 -1
- package/dist/models/responses/graphql/get/lists-management-page-timeline-success.js.map +1 -1
- package/dist/models/responses/graphql/get/profile-spotlights-query-error.d.ts +0 -1
- package/dist/models/responses/graphql/get/profile-spotlights-query-error.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/profile-spotlights-query-error.js +0 -1
- package/dist/models/responses/graphql/get/profile-spotlights-query-error.js.map +1 -1
- package/dist/models/responses/graphql/get/profile-spotlights-query-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/profile-spotlights-query-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/profile-spotlights-query-success.js +0 -1
- package/dist/models/responses/graphql/get/profile-spotlights-query-success.js.map +1 -1
- package/dist/models/responses/graphql/get/quick-promote-eligibility-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/quick-promote-eligibility-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/quick-promote-eligibility-success.js +0 -1
- package/dist/models/responses/graphql/get/quick-promote-eligibility-success.js.map +1 -1
- package/dist/models/responses/graphql/get/search-timeline-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/search-timeline-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/search-timeline-success.js +0 -1
- package/dist/models/responses/graphql/get/search-timeline-success.js.map +1 -1
- package/dist/models/responses/graphql/get/tweet-detail-error.d.ts +0 -1
- package/dist/models/responses/graphql/get/tweet-detail-error.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/tweet-detail-error.js +0 -1
- package/dist/models/responses/graphql/get/tweet-detail-error.js.map +1 -1
- package/dist/models/responses/graphql/get/tweet-detail-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/tweet-detail-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/tweet-detail-success.js +0 -1
- package/dist/models/responses/graphql/get/tweet-detail-success.js.map +1 -1
- package/dist/models/responses/graphql/get/user-by-rest-id-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/user-by-rest-id-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/user-by-rest-id-success.js +0 -1
- package/dist/models/responses/graphql/get/user-by-rest-id-success.js.map +1 -1
- package/dist/models/responses/graphql/get/user-by-screen-name-error.d.ts +0 -1
- package/dist/models/responses/graphql/get/user-by-screen-name-error.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/user-by-screen-name-error.js +0 -1
- package/dist/models/responses/graphql/get/user-by-screen-name-error.js.map +1 -1
- package/dist/models/responses/graphql/get/user-by-screen-name-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/user-by-screen-name-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/user-by-screen-name-success.js +0 -1
- package/dist/models/responses/graphql/get/user-by-screen-name-success.js.map +1 -1
- package/dist/models/responses/graphql/get/user-media-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/user-media-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/user-media-success.js +0 -1
- package/dist/models/responses/graphql/get/user-media-success.js.map +1 -1
- package/dist/models/responses/graphql/get/user-tweets-and-replies-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/user-tweets-and-replies-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/user-tweets-and-replies-success.js +0 -1
- package/dist/models/responses/graphql/get/user-tweets-and-replies-success.js.map +1 -1
- package/dist/models/responses/graphql/get/user-tweets-error.d.ts +0 -1
- package/dist/models/responses/graphql/get/user-tweets-error.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/user-tweets-error.js +0 -1
- package/dist/models/responses/graphql/get/user-tweets-error.js.map +1 -1
- package/dist/models/responses/graphql/get/user-tweets-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/user-tweets-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/user-tweets-success.js +0 -1
- package/dist/models/responses/graphql/get/user-tweets-success.js.map +1 -1
- package/dist/models/responses/graphql/get/users-by-rest-ids-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/users-by-rest-ids-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/users-by-rest-ids-success.js +0 -1
- package/dist/models/responses/graphql/get/users-by-rest-ids-success.js.map +1 -1
- package/dist/models/responses/graphql/get/users-verified-avatars-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/users-verified-avatars-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/users-verified-avatars-success.js +0 -1
- package/dist/models/responses/graphql/get/users-verified-avatars-success.js.map +1 -1
- package/dist/models/responses/graphql/get/viewer-success.d.ts +0 -1
- package/dist/models/responses/graphql/get/viewer-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/get/viewer-success.js +0 -1
- package/dist/models/responses/graphql/get/viewer-success.js.map +1 -1
- package/dist/models/responses/graphql/post/create-retweet-success.d.ts +0 -1
- package/dist/models/responses/graphql/post/create-retweet-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/post/create-retweet-success.js +0 -1
- package/dist/models/responses/graphql/post/create-retweet-success.js.map +1 -1
- package/dist/models/responses/graphql/post/delete-retweet-success.d.ts +0 -1
- package/dist/models/responses/graphql/post/delete-retweet-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/post/delete-retweet-success.js +0 -1
- package/dist/models/responses/graphql/post/delete-retweet-success.js.map +1 -1
- package/dist/models/responses/graphql/post/favorite-tweet-success.d.ts +0 -1
- package/dist/models/responses/graphql/post/favorite-tweet-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/post/favorite-tweet-success.js +0 -1
- package/dist/models/responses/graphql/post/favorite-tweet-success.js.map +1 -1
- package/dist/models/responses/graphql/post/home-latest-timeline-error.d.ts +0 -1
- package/dist/models/responses/graphql/post/home-latest-timeline-error.d.ts.map +1 -1
- package/dist/models/responses/graphql/post/home-latest-timeline-error.js +0 -1
- package/dist/models/responses/graphql/post/home-latest-timeline-error.js.map +1 -1
- package/dist/models/responses/graphql/post/home-latest-timeline-success.d.ts +0 -1
- package/dist/models/responses/graphql/post/home-latest-timeline-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/post/home-latest-timeline-success.js +0 -1
- package/dist/models/responses/graphql/post/home-latest-timeline-success.js.map +1 -1
- package/dist/models/responses/graphql/post/home-timeline-success.d.ts +0 -1
- package/dist/models/responses/graphql/post/home-timeline-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/post/home-timeline-success.js +0 -1
- package/dist/models/responses/graphql/post/home-timeline-success.js.map +1 -1
- package/dist/models/responses/graphql/post/put-client-education-flag-success.d.ts +0 -1
- package/dist/models/responses/graphql/post/put-client-education-flag-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/post/put-client-education-flag-success.js +0 -1
- package/dist/models/responses/graphql/post/put-client-education-flag-success.js.map +1 -1
- package/dist/models/responses/graphql/post/unfavorite-tweet-success.d.ts +0 -1
- package/dist/models/responses/graphql/post/unfavorite-tweet-success.d.ts.map +1 -1
- package/dist/models/responses/graphql/post/unfavorite-tweet-success.js +0 -1
- package/dist/models/responses/graphql/post/unfavorite-tweet-success.js.map +1 -1
- package/dist/options.d.ts +0 -72
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +0 -14
- package/dist/options.js.map +1 -1
- package/dist/parser/base.d.ts +0 -6
- package/dist/parser/base.d.ts.map +1 -1
- package/dist/parser/base.js +0 -6
- package/dist/parser/base.js.map +1 -1
- package/dist/parser/home-timeline-parser.d.ts +0 -11
- package/dist/parser/home-timeline-parser.d.ts.map +1 -1
- package/dist/parser/home-timeline-parser.js +0 -11
- package/dist/parser/home-timeline-parser.js.map +1 -1
- package/dist/parser/parser.test.js +77 -77
- package/dist/parser/parser.test.js.map +1 -1
- package/dist/parser/search-timeline.d.ts +0 -11
- package/dist/parser/search-timeline.d.ts.map +1 -1
- package/dist/parser/search-timeline.js +0 -11
- package/dist/parser/search-timeline.js.map +1 -1
- package/dist/parser/user-like-tweets.d.ts +0 -11
- package/dist/parser/user-like-tweets.d.ts.map +1 -1
- package/dist/parser/user-like-tweets.js +0 -11
- package/dist/parser/user-like-tweets.js.map +1 -1
- package/dist/parser/user-tweets.d.ts +0 -11
- package/dist/parser/user-tweets.d.ts.map +1 -1
- package/dist/parser/user-tweets.js +0 -11
- package/dist/parser/user-tweets.js.map +1 -1
- package/dist/save-responses.js +0 -4
- package/dist/save-responses.js.map +1 -1
- package/dist/saving-responses/index.d.ts +54 -0
- package/dist/saving-responses/index.d.ts.map +1 -0
- package/dist/saving-responses/index.js +189 -0
- package/dist/saving-responses/index.js.map +1 -0
- package/dist/saving-responses/response-entity.d.ts +17 -0
- package/dist/saving-responses/response-entity.d.ts.map +1 -0
- package/dist/saving-responses/response-entity.js +108 -0
- package/dist/saving-responses/response-entity.js.map +1 -0
- package/dist/scraper.d.ts +5 -229
- package/dist/scraper.d.ts.map +1 -1
- package/dist/scraper.js +67 -151
- package/dist/scraper.js.map +1 -1
- package/dist/scraper.test.js +1 -7
- package/dist/scraper.test.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/twitter.d.ts +0 -119
- package/dist/twitter.d.ts.map +1 -1
- package/dist/twitter.js +1 -163
- package/dist/twitter.js.map +1 -1
- package/dist/twitter.test.js +0 -1
- package/dist/twitter.test.js.map +1 -1
- package/package.json +30 -29
- package/dist/tsconfig.tsbuildinfo +0 -1
package/dist/twitter.d.ts
CHANGED
|
@@ -3,147 +3,28 @@ import { TwitterScraper, TwitterScraperOptions } from './scraper';
|
|
|
3
3
|
import { GraphQLGetUserByScreenNameSuccessResponse } from './models/responses/graphql/get/user-by-screen-name-success';
|
|
4
4
|
import { FullUser, Status } from 'twitter-d';
|
|
5
5
|
import { CustomTweetObject } from './models/responses/custom/custom-tweet-object';
|
|
6
|
-
/**
|
|
7
|
-
* {@link TwitterOptions} オプション
|
|
8
|
-
*/
|
|
9
6
|
export type TwitterOptions = TwitterScraperOptions;
|
|
10
|
-
/**
|
|
11
|
-
* Twitter スクレイピングライブラリクラス
|
|
12
|
-
*/
|
|
13
7
|
export declare class Twitter {
|
|
14
8
|
readonly scraper: TwitterScraper;
|
|
15
|
-
/**
|
|
16
|
-
* @param scraper {@link TwitterScraper} インスタンス
|
|
17
|
-
*/
|
|
18
9
|
private constructor();
|
|
19
|
-
/**
|
|
20
|
-
* Twitter にログインする
|
|
21
|
-
*
|
|
22
|
-
* @param options ログインオプション
|
|
23
|
-
* @returns Twitter インスタンス
|
|
24
|
-
*/
|
|
25
10
|
static login(options: TwitterOptions): Promise<Twitter>;
|
|
26
|
-
/**
|
|
27
|
-
* スクリーンネームからユーザー情報を取得する
|
|
28
|
-
*
|
|
29
|
-
* @param options ユーザー情報取得オプション
|
|
30
|
-
* @returns ユーザー情報
|
|
31
|
-
*/
|
|
32
11
|
getUserByScreenName(options: GetUserByScreenNameOptions): Promise<GraphQLGetUserByScreenNameSuccessResponse>;
|
|
33
|
-
/**
|
|
34
|
-
* ユーザー ID からスクリーンネームを取得する
|
|
35
|
-
*
|
|
36
|
-
* @param userId ユーザー ID
|
|
37
|
-
* @returns スクリーンネーム
|
|
38
|
-
*/
|
|
39
12
|
getScreenNameByUserId(options: GetScreenNameByUserIdOptions): Promise<string>;
|
|
40
|
-
/**
|
|
41
|
-
* ユーザー ID からスクリーンネームを取得する
|
|
42
|
-
*
|
|
43
|
-
* @param userId ユーザー ID
|
|
44
|
-
* @returns スクリーンネーム
|
|
45
|
-
*/
|
|
46
13
|
getUserByUserId(options: GetUserByUserIdOptions): Promise<FullUser>;
|
|
47
|
-
/**
|
|
48
|
-
* ユーザー ID からユーザー情報を取得する。ユーザー情報は生レスポンスで返す
|
|
49
|
-
*
|
|
50
|
-
* @param userId ユーザー ID
|
|
51
|
-
* @returns ユーザー情報(生レスポンス)
|
|
52
|
-
*/
|
|
53
14
|
getRawUserByUserId(options: GetUserByUserIdOptions): Promise<GraphQLGetUserByScreenNameSuccessResponse>;
|
|
54
|
-
/**
|
|
55
|
-
* ホームタイムラインのツイートを取得する。
|
|
56
|
-
*
|
|
57
|
-
* @param options ホームタイムライン取得オプション
|
|
58
|
-
* @returns ホームタイムラインのツイート
|
|
59
|
-
*/
|
|
60
15
|
getHomeTimelineTweets(options: GetHomeTimelineTweetsOptions): Promise<Status[]>;
|
|
61
|
-
/**
|
|
62
|
-
* ホームタイムラインのツイートを取得する。ツイートは非正規化ツイート(CustomTweetObject)で返す
|
|
63
|
-
*
|
|
64
|
-
* @param options ホームタイムライン取得オプション
|
|
65
|
-
* @returns ホームタイムラインのツイート(非正規化ツイート)
|
|
66
|
-
*/
|
|
67
16
|
getHomeTimelineRawTweets(options: GetHomeTimelineTweetsOptions): Promise<CustomTweetObject[]>;
|
|
68
|
-
/**
|
|
69
|
-
* ツイートを検索する。
|
|
70
|
-
*
|
|
71
|
-
* @param options 検索オプション
|
|
72
|
-
* @returns 検索結果
|
|
73
|
-
*/
|
|
74
17
|
searchTweets(options: SearchTweetsOptions): Promise<Status[]>;
|
|
75
|
-
/**
|
|
76
|
-
* ツイートを検索する。ツイートは非正規化ツイート(CustomTweetObject)で返す
|
|
77
|
-
*
|
|
78
|
-
* @param options 検索オプション
|
|
79
|
-
* @returns 検索結果(非正規化ツイート)
|
|
80
|
-
*/
|
|
81
18
|
searchRawTweets(options: SearchTweetsOptions): Promise<CustomTweetObject[]>;
|
|
82
|
-
/**
|
|
83
|
-
* ユーザーのツイートを取得する
|
|
84
|
-
*
|
|
85
|
-
* @param options ユーザーツイート取得オプション
|
|
86
|
-
* @returns ユーザーのツイート
|
|
87
|
-
*/
|
|
88
19
|
getUserTweets(options: GetUserTweetsOptions): Promise<Status[]>;
|
|
89
|
-
/**
|
|
90
|
-
* ユーザーのいいねしたツイートを取得する
|
|
91
|
-
*
|
|
92
|
-
* @param options ユーザーいいねツイート取得オプション
|
|
93
|
-
* @returns ユーザーのツイート
|
|
94
|
-
*/
|
|
95
20
|
getUserLikeTweets(options: GetUserLikeTweetsOptions): Promise<Status[]>;
|
|
96
|
-
/**
|
|
97
|
-
* ツイートの情報を取得する
|
|
98
|
-
*
|
|
99
|
-
* @param options ツイート取得オプション
|
|
100
|
-
* @returns ツイート
|
|
101
|
-
*/
|
|
102
21
|
getTweet(options: GetTweetOptions): Promise<Status>;
|
|
103
|
-
/**
|
|
104
|
-
* ツイートの生情報を取得する
|
|
105
|
-
*
|
|
106
|
-
* @param options ツイート取得オプション
|
|
107
|
-
* @returns ツイートの生情報
|
|
108
|
-
*/
|
|
109
22
|
getRawTweet(options: GetTweetOptions): Promise<CustomTweetObject>;
|
|
110
|
-
/**
|
|
111
|
-
* ツイートをいいねする
|
|
112
|
-
*
|
|
113
|
-
* @param options いいねオプション
|
|
114
|
-
* @returns いいねできたかどうかの文字列(Done)
|
|
115
|
-
*/
|
|
116
23
|
likeTweet(options: LikeTweetOptions): Promise<string | undefined>;
|
|
117
|
-
/**
|
|
118
|
-
* ツイートのいいねを解除する
|
|
119
|
-
*
|
|
120
|
-
* @param options いいね解除オプション
|
|
121
|
-
* @returns いいね解除できたかどうかの文字列(Done)
|
|
122
|
-
*/
|
|
123
24
|
unlikeTweet(options: UnlikeTweetOptions): Promise<string | undefined>;
|
|
124
|
-
/**
|
|
125
|
-
* ユーザーをブロックする
|
|
126
|
-
*
|
|
127
|
-
* @param options ブロックオプション
|
|
128
|
-
*/
|
|
129
25
|
blockUser(options: BlockUserOptions): Promise<void>;
|
|
130
|
-
/**
|
|
131
|
-
* ユーザーのブロックを解除する
|
|
132
|
-
*
|
|
133
|
-
* @param options ブロック解除オプション
|
|
134
|
-
*/
|
|
135
26
|
unblockUser(options: UnblockUserOptions): Promise<void>;
|
|
136
|
-
/**
|
|
137
|
-
* ブラウザを閉じる
|
|
138
|
-
*/
|
|
139
27
|
close(): Promise<void>;
|
|
140
|
-
/**
|
|
141
|
-
* エラーレスポンスかどうかを判定する。
|
|
142
|
-
* これを使うことでエラーがどうかは判定できるが、レスポンス型は保証されないので利用側で型保証されるメソッドを書いたほうがよい。
|
|
143
|
-
*
|
|
144
|
-
* @param response レスポンス
|
|
145
|
-
* @returns エラーレスポンスかどうか
|
|
146
|
-
*/
|
|
147
28
|
isErrorResponse(response: any): response is {
|
|
148
29
|
errors: any[];
|
|
149
30
|
};
|
package/dist/twitter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twitter.d.ts","sourceRoot":"","sources":["../src/twitter.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,mBAAmB,EAEnB,wBAAwB,EACxB,oBAAoB,EACpB,4BAA4B,EAC5B,sBAAsB,EACtB,kBAAkB,EAClB,4BAA4B,EAE5B,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EAChB,MAAM,WAAW,CAAA;AAIlB,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAGjE,OAAO,EAAE,yCAAyC,EAAE,MAAM,4DAA4D,CAAA;AACtH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAA;
|
|
1
|
+
{"version":3,"file":"twitter.d.ts","sourceRoot":"","sources":["../src/twitter.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,mBAAmB,EAEnB,wBAAwB,EACxB,oBAAoB,EACpB,4BAA4B,EAC5B,sBAAsB,EACtB,kBAAkB,EAClB,4BAA4B,EAE5B,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EAChB,MAAM,WAAW,CAAA;AAIlB,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAGjE,OAAO,EAAE,yCAAyC,EAAE,MAAM,4DAA4D,CAAA;AACtH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAA;AAMjF,MAAM,MAAM,cAAc,GAAG,qBAAqB,CAAA;AAKlD,qBAAa,OAAO;IAClB,SAAgB,OAAO,EAAE,cAAc,CAAA;IAKvC,OAAO;WAUa,KAAK,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAYvD,mBAAmB,CAC9B,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,yCAAyC,CAAC;IAkCxC,qBAAqB,CAChC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,MAAM,CAAC;IAeL,eAAe,CAC1B,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,QAAQ,CAAC;IAeP,kBAAkB,CAC7B,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,yCAAyC,CAAC;IAyCxC,qBAAqB,CAChC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,MAAM,EAAE,CAAC;IAcP,wBAAwB,CACnC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAoFlB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAc7D,eAAe,CAC1B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA+DlB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA0D/D,iBAAiB,CAC5B,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC;IA8DP,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAWnD,WAAW,CACtB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,iBAAiB,CAAC;IA0DhB,SAAS,CACpB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA6FjB,WAAW,CACtB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA4FjB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkEnD,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuDvD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,eAAe,CAAC,QAAQ,EAAE,GAAG,GAAG,QAAQ,IAAI;QAAE,MAAM,EAAE,GAAG,EAAE,CAAA;KAAE;YAItD,aAAa;CAwB5B"}
|
package/dist/twitter.js
CHANGED
|
@@ -10,33 +10,15 @@ const user_tweets_1 = require("./parser/user-tweets");
|
|
|
10
10
|
const scraper_1 = require("./scraper");
|
|
11
11
|
const converter_1 = require("./converter");
|
|
12
12
|
const home_timeline_parser_1 = require("./parser/home-timeline-parser");
|
|
13
|
-
/**
|
|
14
|
-
* Twitter スクレイピングライブラリクラス
|
|
15
|
-
*/
|
|
16
13
|
class Twitter {
|
|
17
|
-
/**
|
|
18
|
-
* @param scraper {@link TwitterScraper} インスタンス
|
|
19
|
-
*/
|
|
20
14
|
constructor(scraper) {
|
|
21
15
|
this.scraper = scraper;
|
|
22
16
|
}
|
|
23
|
-
/**
|
|
24
|
-
* Twitter にログインする
|
|
25
|
-
*
|
|
26
|
-
* @param options ログインオプション
|
|
27
|
-
* @returns Twitter インスタンス
|
|
28
|
-
*/
|
|
29
17
|
static async login(options) {
|
|
30
18
|
const scraper = new scraper_1.TwitterScraper(options);
|
|
31
19
|
await scraper.login();
|
|
32
20
|
return new Twitter(scraper);
|
|
33
21
|
}
|
|
34
|
-
/**
|
|
35
|
-
* スクリーンネームからユーザー情報を取得する
|
|
36
|
-
*
|
|
37
|
-
* @param options ユーザー情報取得オプション
|
|
38
|
-
* @returns ユーザー情報
|
|
39
|
-
*/
|
|
40
22
|
async getUserByScreenName(options) {
|
|
41
23
|
if (!options.screenName) {
|
|
42
24
|
throw new exceptions_1.IllegalArgumentError('screenName is required');
|
|
@@ -60,12 +42,6 @@ class Twitter {
|
|
|
60
42
|
}
|
|
61
43
|
return response;
|
|
62
44
|
}
|
|
63
|
-
/**
|
|
64
|
-
* ユーザー ID からスクリーンネームを取得する
|
|
65
|
-
*
|
|
66
|
-
* @param userId ユーザー ID
|
|
67
|
-
* @returns スクリーンネーム
|
|
68
|
-
*/
|
|
69
45
|
async getScreenNameByUserId(options) {
|
|
70
46
|
if (!options.userId) {
|
|
71
47
|
throw new exceptions_1.IllegalArgumentError('userId is required');
|
|
@@ -73,12 +49,6 @@ class Twitter {
|
|
|
73
49
|
const user = await this.getRawUserByUserId(options);
|
|
74
50
|
return user.data.user.result.legacy.screen_name;
|
|
75
51
|
}
|
|
76
|
-
/**
|
|
77
|
-
* ユーザー ID からスクリーンネームを取得する
|
|
78
|
-
*
|
|
79
|
-
* @param userId ユーザー ID
|
|
80
|
-
* @returns スクリーンネーム
|
|
81
|
-
*/
|
|
82
52
|
async getUserByUserId(options) {
|
|
83
53
|
if (!options.userId) {
|
|
84
54
|
throw new exceptions_1.IllegalArgumentError('userId is required');
|
|
@@ -86,21 +56,13 @@ class Twitter {
|
|
|
86
56
|
const user = await this.getRawUserByUserId(options);
|
|
87
57
|
return converter_1.ObjectConverter.convertToFullUser(user);
|
|
88
58
|
}
|
|
89
|
-
/**
|
|
90
|
-
* ユーザー ID からユーザー情報を取得する。ユーザー情報は生レスポンスで返す
|
|
91
|
-
*
|
|
92
|
-
* @param userId ユーザー ID
|
|
93
|
-
* @returns ユーザー情報(生レスポンス)
|
|
94
|
-
*/
|
|
95
59
|
async getRawUserByUserId(options) {
|
|
96
|
-
// TODO: ユーザー情報をv1.1あたりのモデルに変換する処理を入れた方がいい
|
|
97
60
|
if (!options.userId) {
|
|
98
61
|
throw new exceptions_1.IllegalArgumentError('userId is required');
|
|
99
62
|
}
|
|
100
63
|
const page = await this.scraper.getScraperPage();
|
|
101
64
|
let response;
|
|
102
65
|
try {
|
|
103
|
-
// UserByRestIdだとログインユーザー自分自身の場合に取得できない。
|
|
104
66
|
response = await page.waitSingleResponse(`https://twitter.com/intent/user?user_id=${options.userId}`, 'GET', 'GRAPHQL', 'UserByScreenName');
|
|
105
67
|
}
|
|
106
68
|
catch (error) {
|
|
@@ -120,25 +82,11 @@ class Twitter {
|
|
|
120
82
|
}
|
|
121
83
|
return response;
|
|
122
84
|
}
|
|
123
|
-
/**
|
|
124
|
-
* ホームタイムラインのツイートを取得する。
|
|
125
|
-
*
|
|
126
|
-
* @param options ホームタイムライン取得オプション
|
|
127
|
-
* @returns ホームタイムラインのツイート
|
|
128
|
-
*/
|
|
129
85
|
async getHomeTimelineTweets(options) {
|
|
130
86
|
const rawTweets = await this.getHomeTimelineRawTweets(options);
|
|
131
87
|
return rawTweets.map((rawTweet) => converter_1.ObjectConverter.convertToStatus(rawTweet));
|
|
132
88
|
}
|
|
133
|
-
/**
|
|
134
|
-
* ホームタイムラインのツイートを取得する。ツイートは非正規化ツイート(CustomTweetObject)で返す
|
|
135
|
-
*
|
|
136
|
-
* @param options ホームタイムライン取得オプション
|
|
137
|
-
* @returns ホームタイムラインのツイート(非正規化ツイート)
|
|
138
|
-
*/
|
|
139
89
|
async getHomeTimelineRawTweets(options) {
|
|
140
|
-
// おすすめタブ: HomeTimeline
|
|
141
|
-
// フォロー中タブ: HomeLatestTimeline
|
|
142
90
|
if (!options.timelineType) {
|
|
143
91
|
throw new exceptions_1.IllegalArgumentError('timelineType is required');
|
|
144
92
|
}
|
|
@@ -154,7 +102,6 @@ class Twitter {
|
|
|
154
102
|
const results = [];
|
|
155
103
|
try {
|
|
156
104
|
await page.goto(url);
|
|
157
|
-
// タブ選択
|
|
158
105
|
const tabs = await page.page.$$('nav[aria-live="polite"] div[role="tablist"] > div');
|
|
159
106
|
const tabIndex = options.timelineType === options_1.TimelineType.RECOMMEND ? 0 : 1;
|
|
160
107
|
if (!tabs[tabIndex]) {
|
|
@@ -164,7 +111,6 @@ class Twitter {
|
|
|
164
111
|
let lastResponseAt = Date.now();
|
|
165
112
|
while (true) {
|
|
166
113
|
if (Date.now() - lastResponseAt > 1000 * 30) {
|
|
167
|
-
// 30秒以上レスポンスがない場合はタイムアウトとして終了
|
|
168
114
|
break;
|
|
169
115
|
}
|
|
170
116
|
const getResponse = page.shiftResponse('GET', 'GRAPHQL', endpointName);
|
|
@@ -198,22 +144,10 @@ class Twitter {
|
|
|
198
144
|
}
|
|
199
145
|
return results;
|
|
200
146
|
}
|
|
201
|
-
/**
|
|
202
|
-
* ツイートを検索する。
|
|
203
|
-
*
|
|
204
|
-
* @param options 検索オプション
|
|
205
|
-
* @returns 検索結果
|
|
206
|
-
*/
|
|
207
147
|
async searchTweets(options) {
|
|
208
148
|
const rawTweets = await this.searchRawTweets(options);
|
|
209
149
|
return rawTweets.map((rawTweet) => converter_1.ObjectConverter.convertToStatus(rawTweet));
|
|
210
150
|
}
|
|
211
|
-
/**
|
|
212
|
-
* ツイートを検索する。ツイートは非正規化ツイート(CustomTweetObject)で返す
|
|
213
|
-
*
|
|
214
|
-
* @param options 検索オプション
|
|
215
|
-
* @returns 検索結果(非正規化ツイート)
|
|
216
|
-
*/
|
|
217
151
|
async searchRawTweets(options) {
|
|
218
152
|
if (!options.query) {
|
|
219
153
|
throw new exceptions_1.IllegalArgumentError('query is required');
|
|
@@ -233,7 +167,6 @@ class Twitter {
|
|
|
233
167
|
let lastResponseAt = Date.now();
|
|
234
168
|
while (true) {
|
|
235
169
|
if (Date.now() - lastResponseAt > 1000 * 30) {
|
|
236
|
-
// 30秒以上レスポンスがない場合はタイムアウトとして終了
|
|
237
170
|
break;
|
|
238
171
|
}
|
|
239
172
|
const response = page.shiftResponse('GET', 'GRAPHQL', 'SearchTimeline');
|
|
@@ -264,12 +197,6 @@ class Twitter {
|
|
|
264
197
|
}
|
|
265
198
|
return results;
|
|
266
199
|
}
|
|
267
|
-
/**
|
|
268
|
-
* ユーザーのツイートを取得する
|
|
269
|
-
*
|
|
270
|
-
* @param options ユーザーツイート取得オプション
|
|
271
|
-
* @returns ユーザーのツイート
|
|
272
|
-
*/
|
|
273
200
|
async getUserTweets(options) {
|
|
274
201
|
if (!options.screenName) {
|
|
275
202
|
throw new exceptions_1.IllegalArgumentError('screenName is required');
|
|
@@ -287,7 +214,6 @@ class Twitter {
|
|
|
287
214
|
let lastResponseAt = Date.now();
|
|
288
215
|
while (true) {
|
|
289
216
|
if (Date.now() - lastResponseAt > 1000 * 30) {
|
|
290
|
-
// 30秒以上レスポンスがない場合はタイムアウトとして終了
|
|
291
217
|
break;
|
|
292
218
|
}
|
|
293
219
|
const response = page.shiftResponse('GET', 'GRAPHQL', 'UserTweets');
|
|
@@ -318,12 +244,6 @@ class Twitter {
|
|
|
318
244
|
}
|
|
319
245
|
return results;
|
|
320
246
|
}
|
|
321
|
-
/**
|
|
322
|
-
* ユーザーのいいねしたツイートを取得する
|
|
323
|
-
*
|
|
324
|
-
* @param options ユーザーいいねツイート取得オプション
|
|
325
|
-
* @returns ユーザーのツイート
|
|
326
|
-
*/
|
|
327
247
|
async getUserLikeTweets(options) {
|
|
328
248
|
if (!options.screenName) {
|
|
329
249
|
throw new exceptions_1.IllegalArgumentError('screenName is required');
|
|
@@ -341,7 +261,6 @@ class Twitter {
|
|
|
341
261
|
let lastResponseAt = Date.now();
|
|
342
262
|
while (true) {
|
|
343
263
|
if (Date.now() - lastResponseAt > 1000 * 30) {
|
|
344
|
-
// 30秒以上レスポンスがない場合はタイムアウトとして終了
|
|
345
264
|
break;
|
|
346
265
|
}
|
|
347
266
|
const response = page.shiftResponse('GET', 'GRAPHQL', 'Likes');
|
|
@@ -372,22 +291,10 @@ class Twitter {
|
|
|
372
291
|
}
|
|
373
292
|
return results;
|
|
374
293
|
}
|
|
375
|
-
/**
|
|
376
|
-
* ツイートの情報を取得する
|
|
377
|
-
*
|
|
378
|
-
* @param options ツイート取得オプション
|
|
379
|
-
* @returns ツイート
|
|
380
|
-
*/
|
|
381
294
|
async getTweet(options) {
|
|
382
295
|
const rawTweet = await this.getRawTweet(options);
|
|
383
296
|
return converter_1.ObjectConverter.convertToStatus(rawTweet);
|
|
384
297
|
}
|
|
385
|
-
/**
|
|
386
|
-
* ツイートの生情報を取得する
|
|
387
|
-
*
|
|
388
|
-
* @param options ツイート取得オプション
|
|
389
|
-
* @returns ツイートの生情報
|
|
390
|
-
*/
|
|
391
298
|
async getRawTweet(options) {
|
|
392
299
|
if (!options.tweetId) {
|
|
393
300
|
throw new exceptions_1.IllegalArgumentError('tweetId is required');
|
|
@@ -419,40 +326,23 @@ class Twitter {
|
|
|
419
326
|
}
|
|
420
327
|
catch (error) {
|
|
421
328
|
await page.close();
|
|
422
|
-
// if timeout
|
|
423
329
|
if (error instanceof puppeteer_core_1.TimeoutError) {
|
|
424
330
|
throw new exceptions_1.TwitterTimeoutError('Failed to operate twitter');
|
|
425
331
|
}
|
|
426
332
|
throw error;
|
|
427
333
|
}
|
|
428
334
|
}
|
|
429
|
-
/**
|
|
430
|
-
* ツイートをいいねする
|
|
431
|
-
*
|
|
432
|
-
* @param options いいねオプション
|
|
433
|
-
* @returns いいねできたかどうかの文字列(Done)
|
|
434
|
-
*/
|
|
435
335
|
async likeTweet(options) {
|
|
436
336
|
if (!options.tweetId) {
|
|
437
337
|
throw new exceptions_1.IllegalArgumentError('tweetId is required');
|
|
438
338
|
}
|
|
439
339
|
const page = await this.scraper.getScraperPage();
|
|
440
|
-
// ツイートページを開く (30sec timeout)
|
|
441
|
-
// -> 削除済みその他でツイートが存在しない場合は TwitterOperationError を投げる (TweetDetail のレスポンスがerrorになる)
|
|
442
|
-
// いいねボタンが表示されるまで待つ (10sec timeout)
|
|
443
|
-
// -> いいねボタンがすでにクリック済みの場合は AlreadyLikedError を投げる
|
|
444
|
-
// -> いいねボタンが表示されなかった場合は TwitterOperationError を投げる
|
|
445
|
-
// いいねボタンをクリックする
|
|
446
|
-
// いいね完了まで待つ (10sec timeout)
|
|
447
|
-
// -> いいね完了しなかった場合は TwitterOperationError を投げる
|
|
448
|
-
// ツイートページを閉じる
|
|
449
340
|
try {
|
|
450
341
|
const url = `https://twitter.com/i/status/${options.tweetId}`;
|
|
451
342
|
const responseDetail = await page.waitSingleResponse(url, 'GET', 'GRAPHQL', 'TweetDetail', 30000);
|
|
452
343
|
if (!responseDetail) {
|
|
453
344
|
throw new exceptions_1.TwitterOperationError('Failed to get tweet detail');
|
|
454
345
|
}
|
|
455
|
-
// いいねボタンが表示されるまで待つ
|
|
456
346
|
const likeButtonSelector = 'article[tabindex="-1"] div[role="button"][data-testid="like"]';
|
|
457
347
|
const unlikeButtonSelector = 'article[tabindex="-1"] div[role="button"][data-testid="unlike"]';
|
|
458
348
|
const likeButton = await page.page.waitForSelector(`${likeButtonSelector}, ${unlikeButtonSelector}`, {
|
|
@@ -468,54 +358,34 @@ class Twitter {
|
|
|
468
358
|
if (isLiked) {
|
|
469
359
|
throw new exceptions_1.AlreadyLikedError();
|
|
470
360
|
}
|
|
471
|
-
// いいねボタンをクリックする
|
|
472
361
|
const responseFavoritePromise = page.waitSingleResponse(null, 'POST', 'GRAPHQL', 'FavoriteTweet', 10000);
|
|
473
362
|
await page.waitAndClick(likeButtonSelector, true);
|
|
474
|
-
// いいね完了まで待つ
|
|
475
363
|
const responseFavorite = await responseFavoritePromise;
|
|
476
364
|
if (!responseFavorite) {
|
|
477
365
|
throw new exceptions_1.TwitterOperationError('Failed to favorite tweet');
|
|
478
366
|
}
|
|
479
|
-
// ツイートページを閉じる
|
|
480
367
|
await page.close();
|
|
481
368
|
return responseFavorite.data.favorite_tweet;
|
|
482
369
|
}
|
|
483
370
|
catch (error) {
|
|
484
371
|
await page.close();
|
|
485
|
-
// if timeout
|
|
486
372
|
if (error instanceof puppeteer_core_1.TimeoutError) {
|
|
487
373
|
throw new exceptions_1.TwitterTimeoutError('Failed to operate twitter');
|
|
488
374
|
}
|
|
489
375
|
throw error;
|
|
490
376
|
}
|
|
491
377
|
}
|
|
492
|
-
/**
|
|
493
|
-
* ツイートのいいねを解除する
|
|
494
|
-
*
|
|
495
|
-
* @param options いいね解除オプション
|
|
496
|
-
* @returns いいね解除できたかどうかの文字列(Done)
|
|
497
|
-
*/
|
|
498
378
|
async unlikeTweet(options) {
|
|
499
379
|
if (!options.tweetId) {
|
|
500
380
|
throw new exceptions_1.IllegalArgumentError('tweetId is required');
|
|
501
381
|
}
|
|
502
382
|
const page = await this.scraper.getScraperPage();
|
|
503
|
-
// ツイートページを開く (30sec timeout)
|
|
504
|
-
// -> 削除済みその他でツイートが存在しない場合は TwitterOperationError を投げる (TweetDetail のレスポンスがerrorになる)
|
|
505
|
-
// いいね済みボタンが表示されるまで待つ (10sec timeout)
|
|
506
|
-
// -> いいねボタンがすでにクリック済みではない場合は NotLikedError を投げる
|
|
507
|
-
// -> いいねボタンが表示されなかった場合は TwitterOperationError を投げる
|
|
508
|
-
// いいねボタンをクリックする
|
|
509
|
-
// いいね完了まで待つ (10sec timeout)
|
|
510
|
-
// -> いいね完了しなかった場合は TwitterOperationError を投げる
|
|
511
|
-
// ツイートページを閉じる
|
|
512
383
|
try {
|
|
513
384
|
const url = `https://twitter.com/i/status/${options.tweetId}`;
|
|
514
385
|
const responseDetail = await page.waitSingleResponse(url, 'GET', 'GRAPHQL', 'TweetDetail', 30000);
|
|
515
386
|
if (!responseDetail) {
|
|
516
387
|
throw new exceptions_1.TwitterOperationError('Failed to get tweet detail');
|
|
517
388
|
}
|
|
518
|
-
// いいねボタンが表示されるまで待つ
|
|
519
389
|
const likeButtonSelector = 'article[tabindex="-1"] div[role="button"][data-testid="like"]';
|
|
520
390
|
const unlikeButtonSelector = 'article[tabindex="-1"] div[role="button"][data-testid="unlike"]';
|
|
521
391
|
const unlikeButton = await page.page.waitForSelector(`${likeButtonSelector}, ${unlikeButtonSelector}`, {
|
|
@@ -531,32 +401,23 @@ class Twitter {
|
|
|
531
401
|
if (!isLiked) {
|
|
532
402
|
throw new exceptions_1.NotLikedError();
|
|
533
403
|
}
|
|
534
|
-
// いいねボタンをクリックする
|
|
535
404
|
const responseFavoritePromise = page.waitSingleResponse(null, 'POST', 'GRAPHQL', 'UnfavoriteTweet', 10000);
|
|
536
405
|
await page.waitAndClick(unlikeButtonSelector, true);
|
|
537
|
-
// いいね完了まで待つ
|
|
538
406
|
const responseFavorite = await responseFavoritePromise;
|
|
539
407
|
if (!responseFavorite) {
|
|
540
408
|
throw new exceptions_1.TwitterOperationError('Failed to favorite tweet');
|
|
541
409
|
}
|
|
542
|
-
// ツイートページを閉じる
|
|
543
410
|
await page.close();
|
|
544
411
|
return responseFavorite.data.unfavorite_tweet;
|
|
545
412
|
}
|
|
546
413
|
catch (error) {
|
|
547
414
|
await page.close();
|
|
548
|
-
// if timeout
|
|
549
415
|
if (error instanceof puppeteer_core_1.TimeoutError) {
|
|
550
416
|
throw new exceptions_1.TwitterTimeoutError('Failed to operate twitter');
|
|
551
417
|
}
|
|
552
418
|
throw error;
|
|
553
419
|
}
|
|
554
420
|
}
|
|
555
|
-
/**
|
|
556
|
-
* ユーザーをブロックする
|
|
557
|
-
*
|
|
558
|
-
* @param options ブロックオプション
|
|
559
|
-
*/
|
|
560
421
|
async blockUser(options) {
|
|
561
422
|
if (!options.screenName && !options.userId) {
|
|
562
423
|
throw new exceptions_1.IllegalArgumentError('screenName or userId is required');
|
|
@@ -570,7 +431,6 @@ class Twitter {
|
|
|
570
431
|
if (this.isErrorResponse(response)) {
|
|
571
432
|
throw new exceptions_1.TwitterOperationError(response.errors[0].message);
|
|
572
433
|
}
|
|
573
|
-
// プロフィールの表示制限
|
|
574
434
|
const viewProfileButton = await page.page.$('div[data-testid="emptyState"] div[role="button"]');
|
|
575
435
|
if (viewProfileButton) {
|
|
576
436
|
await viewProfileButton.click();
|
|
@@ -581,7 +441,6 @@ class Twitter {
|
|
|
581
441
|
throw new exceptions_1.TwitterOperationError('Failed to get user status');
|
|
582
442
|
}
|
|
583
443
|
if (userStatus === 'unblock') {
|
|
584
|
-
// 既にブロック済み
|
|
585
444
|
throw new exceptions_1.AlreadyBlockedError();
|
|
586
445
|
}
|
|
587
446
|
await page.waitAndClick('div[data-testid="userActions"]', true);
|
|
@@ -594,18 +453,12 @@ class Twitter {
|
|
|
594
453
|
}
|
|
595
454
|
catch (error) {
|
|
596
455
|
await page.close();
|
|
597
|
-
// if timeout
|
|
598
456
|
if (error instanceof puppeteer_core_1.TimeoutError) {
|
|
599
457
|
throw new exceptions_1.TwitterTimeoutError('Failed to operate twitter');
|
|
600
458
|
}
|
|
601
459
|
throw error;
|
|
602
460
|
}
|
|
603
461
|
}
|
|
604
|
-
/**
|
|
605
|
-
* ユーザーのブロックを解除する
|
|
606
|
-
*
|
|
607
|
-
* @param options ブロック解除オプション
|
|
608
|
-
*/
|
|
609
462
|
async unblockUser(options) {
|
|
610
463
|
if (!options.screenName && !options.userId) {
|
|
611
464
|
throw new exceptions_1.IllegalArgumentError('screenName or userId is required');
|
|
@@ -616,7 +469,6 @@ class Twitter {
|
|
|
616
469
|
const page = await this.scraper.getScraperPage();
|
|
617
470
|
await page.goto(url);
|
|
618
471
|
try {
|
|
619
|
-
// プロフィールの表示制限
|
|
620
472
|
const viewProfileButton = await page.page.$('div[data-testid="emptyState"] div[role="button"]');
|
|
621
473
|
if (viewProfileButton) {
|
|
622
474
|
await viewProfileButton.click();
|
|
@@ -627,7 +479,6 @@ class Twitter {
|
|
|
627
479
|
throw new exceptions_1.TwitterOperationError('Failed to get user status');
|
|
628
480
|
}
|
|
629
481
|
if (userStatus !== 'unblock') {
|
|
630
|
-
// 既にブロック解除済み
|
|
631
482
|
throw new exceptions_1.NotBlockedError();
|
|
632
483
|
}
|
|
633
484
|
await page.waitAndClick('div[data-testid="userActions"]', true);
|
|
@@ -640,32 +491,19 @@ class Twitter {
|
|
|
640
491
|
}
|
|
641
492
|
catch (error) {
|
|
642
493
|
await page.close();
|
|
643
|
-
// if timeout
|
|
644
494
|
if (error instanceof puppeteer_core_1.TimeoutError) {
|
|
645
495
|
throw new exceptions_1.TwitterTimeoutError('Failed to operate twitter');
|
|
646
496
|
}
|
|
647
497
|
throw error;
|
|
648
498
|
}
|
|
649
499
|
}
|
|
650
|
-
/**
|
|
651
|
-
* ブラウザを閉じる
|
|
652
|
-
*/
|
|
653
500
|
async close() {
|
|
654
501
|
await this.scraper.close();
|
|
655
502
|
}
|
|
656
|
-
/**
|
|
657
|
-
* エラーレスポンスかどうかを判定する。
|
|
658
|
-
* これを使うことでエラーがどうかは判定できるが、レスポンス型は保証されないので利用側で型保証されるメソッドを書いたほうがよい。
|
|
659
|
-
*
|
|
660
|
-
* @param response レスポンス
|
|
661
|
-
* @returns エラーレスポンスかどうか
|
|
662
|
-
*/
|
|
663
503
|
isErrorResponse(response) {
|
|
664
504
|
return response.errors && response.errors.length > 0;
|
|
665
505
|
}
|
|
666
506
|
async getUserStatus(page) {
|
|
667
|
-
// 1234567890-follow
|
|
668
|
-
// 1234567890-unblock
|
|
669
507
|
const testId = await page.evaluate(() => {
|
|
670
508
|
return new Promise((resolve) => {
|
|
671
509
|
const interval = setInterval(() => {
|
|
@@ -677,7 +515,7 @@ class Twitter {
|
|
|
677
515
|
setTimeout(() => {
|
|
678
516
|
clearInterval(interval);
|
|
679
517
|
resolve();
|
|
680
|
-
}, 1000 * 60 * 2);
|
|
518
|
+
}, 1000 * 60 * 2);
|
|
681
519
|
});
|
|
682
520
|
});
|
|
683
521
|
return testId;
|