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