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 +7 -0
- data/lib/request_handler.rb +33 -0
- data/lib/threads/api_client.rb +93 -0
- data/lib/threads.rb +6 -0
- metadata +76 -0
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
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: []
|