meta_threads 1.0.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e793d2d4079de3e3eefdb8db3e759b816a896eb8bdc75247573ee7c46e109eba
4
+ data.tar.gz: f40460cf619d53355c8b4f55a3d14d46eba6b8d346e02a38589722990a1cacad
5
+ SHA512:
6
+ metadata.gz: 1524ee51de6f4759d013d3334871b348aaf28749939c099016db3e9d0685a2b5c0b22997070625544ef8465c4623f59e7f39798068638ee68e7e334ccb5f5c58
7
+ data.tar.gz: 65bc7f8b9a4e810048e586d88d7146b98528cfa073cbdd63d8af28bd6edc6fc5b8eb6d1de320a69f872e212fdc095924ef97bf388807c0d94b5ef2809f498bc6
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/https'
4
+ require 'json'
5
+ require 'net/http'
6
+
7
+ module ThreadsApi
8
+ # The `RequestHandler` class provides methods for sending HTTP GET and POST requests.
9
+ class RequestHandler
10
+ # It is a class method that sends an HTTP GET request to the specified URL and returns the response body.
11
+ def self.send_get_request(url)
12
+ uri = URI(url)
13
+ http = Net::HTTP.new(uri.host, uri.port)
14
+ http.use_ssl = true
15
+
16
+ request = Net::HTTP::Get.new(uri)
17
+ response = http.request(request)
18
+ response.body
19
+ end
20
+
21
+ # It is a class method that sends an HTTP POST request to the specified URL with the provided headers and data.
22
+ def self.send_request(url:, headers:, data:)
23
+ uri = URI(url)
24
+ http = Net::HTTP.new(uri.host, uri.port)
25
+ http.use_ssl = true
26
+
27
+ request = Net::HTTP::Post.new(uri.path, headers)
28
+ request.set_form_data(data)
29
+
30
+ http.request(request)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'threads/request_handler'
4
+ require 'json'
5
+
6
+ module Threads
7
+ # Provides methods for making API requests to the Threads API and retrieving user information and threads.
8
+ class ApiClient
9
+ BASE_URL = 'https://www.threads.net'
10
+ API_URL = "#{BASE_URL}/api/graphql"
11
+
12
+ def initialize
13
+ @token = token
14
+ @headers = {
15
+ 'Content-Type' => 'application/x-www-form-urlencoded',
16
+ 'X-IG-App-ID' => '238260118697367',
17
+ 'X-FB-LSD' => @token,
18
+ 'Sec-Fetch-Site' => 'same-origin'
19
+ }
20
+ end
21
+
22
+ def get_user_id_from_username(username)
23
+ response = Threads::RequestHandler.send_get_request("#{BASE_URL}/@#{username}")
24
+ text = response.gsub("\n", '')
25
+
26
+ user_id = text.match(/"props":{"user_id":"(\d+)"},/)
27
+ user_id ? user_id[1] : nil
28
+ end
29
+
30
+ def get_user(username)
31
+ id = get_user_id_from_username(username)
32
+ response = Threads::RequestHandler.send_request(
33
+ url: API_URL, headers: @headers,
34
+ data: {
35
+ 'lsd' => @token,
36
+ 'variables' => { 'userID' => id }.to_json,
37
+ 'doc_id' => '23996318473300828'
38
+ }
39
+ )
40
+
41
+ JSON.parse(response.body)
42
+ end
43
+
44
+ def get_user_threads(username)
45
+ id = get_user_id_from_username(username)
46
+ response = Threads::RequestHandler.send_request(
47
+ url: API_URL, headers: @headers,
48
+ data: {
49
+ 'lsd' => @token,
50
+ 'variables' => { 'userID' => id }.to_json,
51
+ 'doc_id' => '6232751443445612'
52
+ }
53
+ )
54
+
55
+ JSON.parse(response.body)
56
+ end
57
+
58
+ def get_post(post_id)
59
+ response = Threads::RequestHandler.send_request(
60
+ url: API_URL, headers: @headers,
61
+ data: {
62
+ 'lsd' => @token,
63
+ 'variables' => { 'postID' => post_id }.to_json,
64
+ 'doc_id' => '5587632691339264'
65
+ }
66
+ )
67
+
68
+ JSON.parse(response.body)
69
+ end
70
+
71
+ def get_user_replies(username)
72
+ id = get_user_id_from_username(username)
73
+ response = Threads::RequestHandler.send_request(
74
+ url: API_URL, headers: @headers,
75
+ data: {
76
+ 'lsd' => @token,
77
+ 'variables' => { 'userID' => id }.to_json,
78
+ 'doc_id' => '6307072669391286'
79
+ }
80
+ )
81
+
82
+ JSON.parse(response.body)
83
+ end
84
+
85
+ private
86
+
87
+ def token
88
+ response = Threads::RequestHandler.send_get_request("#{BASE_URL}/@instagram")
89
+ token_key_position = response&.index('token')
90
+ response&.slice(token_key_position + 9, 22)
91
+ end
92
+ end
93
+ end
data/lib/threads.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'threads_api/request_handler'
2
+ require 'threads_api/api_client'
3
+
4
+ # Threads (threads.net) API wrapper implementation.
5
+ module Threads
6
+ end
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: meta_threads
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Nirav Kanani
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-07-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: net-http
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: A Ruby gem that provides convenient methods for interacting with the
42
+ Meta's Threads.
43
+ email:
44
+ - kananinirav0@gmail.com
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - lib/request_handler.rb
50
+ - lib/threads.rb
51
+ - lib/threads/api_client.rb
52
+ homepage: https://github.com/kananinirav/threads-api
53
+ licenses:
54
+ - MIT
55
+ metadata:
56
+ source_code_uri: https://github.com/kananinirav/threads-api
57
+ post_install_message:
58
+ rdoc_options: []
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: '2.7'
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ requirements: []
72
+ rubygems_version: 3.2.3
73
+ signing_key:
74
+ specification_version: 4
75
+ summary: A Ruby gem for interacting with the Meta's Threads.
76
+ test_files: []