0x0x230x

Untitled

Feb 7th, 2025
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.95 KB | None | 0 0
  1. import 'server-only';
  2. import { env } from '@/lib/config/env';
  3. import { cookies } from 'next/headers';
  4.  
  5. class TwitterService {
  6. private static instance: TwitterService | null = null;
  7.  
  8. private constructor() {}
  9.  
  10. public static getInstance(): TwitterService {
  11. if (!TwitterService.instance) {
  12. TwitterService.instance = new TwitterService();
  13. }
  14. return TwitterService.instance;
  15. }
  16.  
  17. async like({
  18. tweetId,
  19. accessToken,
  20. }: {
  21. tweetId: string;
  22. accessToken: string;
  23. }) {
  24. const userId = await this.getCurrentUserId({ accessToken });
  25. console.log('Making like request:', {
  26. userId,
  27. tweetId,
  28. accessToken: accessToken.substring(0, 10) + '...', // Log partial token
  29. });
  30. const response = await fetch(
  31. `https://api.twitter.com/2/users/${userId}/likes`,
  32. {
  33. method: 'POST',
  34. headers: {
  35. Authorization: `Bearer ${accessToken}`,
  36. 'Content-Type': 'application/json',
  37. },
  38. body: JSON.stringify({ tweet_id: tweetId }),
  39. },
  40. );
  41. if (!response.ok) {
  42. throw new Error(`Failed to like: ${response.status} ${response}`);
  43. }
  44. return response.json();
  45. }
  46.  
  47. async retweet({
  48. tweetId,
  49. accessToken,
  50. }: {
  51. tweetId: string;
  52. accessToken: string;
  53. }) {
  54. const userId = await this.getCurrentUserId({ accessToken });
  55. const response = await fetch(
  56. `https://api.twitter.com/2/users/${userId}/retweets`,
  57. {
  58. method: 'POST',
  59. headers: {
  60. Authorization: `Bearer ${accessToken}`,
  61. 'Content-Type': 'application/json',
  62. },
  63. body: JSON.stringify({
  64. tweet_id: tweetId,
  65. }),
  66. },
  67. );
  68. if (!response.ok) {
  69. throw new Error(`Failed to retweet: ${response.status} ${response}`);
  70. }
  71. return response.json();
  72. }
  73.  
  74. async boost({
  75. tweetId,
  76. accessToken,
  77. }: {
  78. tweetId: string;
  79. accessToken: string;
  80. }) {
  81. const like = await this.like({ tweetId, accessToken });
  82. await new Promise((resolve) => setTimeout(resolve, 2000));
  83. const retweet = await this.retweet({ tweetId, accessToken });
  84. return {
  85. like,
  86. retweet,
  87. };
  88. }
  89.  
  90. async getCurrentUserId({ accessToken }: { accessToken: string }) {
  91. const cookieStore = await cookies();
  92. const userId = cookieStore.get('twitter_user_id');
  93. if (userId) {
  94. console.log('User twee id from cookies');
  95. return userId.value;
  96. }
  97. const response = await fetch('https://api.twitter.com/2/users/me', {
  98. headers: {
  99. Authorization: `Bearer ${accessToken}`,
  100. },
  101. });
  102. if (!response.ok) {
  103. throw new Error(`Failed to get user info: ${response.status}`);
  104. }
  105. const data = await response.json();
  106. cookieStore.set('twitter_user_id', data.data.id);
  107. return data.data.id;
  108. }
  109. }
  110.  
  111. // Export a singleton instance
  112. export const twitterService = TwitterService.getInstance();
Advertisement
Add Comment
Please, Sign In to add comment