SmmPostLog.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <?php
  2. namespace App\Distributor\Repositories;
  3. use App\Models\SmmPostLog as Model;
  4. use Carbon\Carbon;
  5. use Dcat\Admin\Repositories\EloquentRepository;
  6. class SmmPostLog extends EloquentRepository
  7. {
  8. /**
  9. * Model.
  10. *
  11. * @var string
  12. */
  13. protected $eloquentClass = Model::class;
  14. /*
  15. * 创建日志
  16. */
  17. public static function createLog($data)
  18. {
  19. $log = new Model();
  20. $log->post_id = $data['post_id'];
  21. $log->account_id = $data['account_id'];
  22. $log->account_name = $data['account_name'];
  23. $log->status = $data['status'];
  24. $log->remark = $data['remark'];
  25. $log->created_at = $data['created_at'];
  26. $log->updated_at = $data['updated_at'];
  27. $log->dist_id = $data['dist_id'];
  28. $log->media_name = $data['media_name'];
  29. $log->response_ids = $data['response_ids'];
  30. $log->send_time = $data['send_time'];
  31. $log->save();
  32. }
  33. /*
  34. * 找状态为0并且发送时间小于当前时间的日志
  35. */
  36. public static function getSendLog($limit = 5)
  37. {
  38. $log = new Model();
  39. $result = $log->where('status', 1)->first();//查找状态为1的日志,发送中的日志
  40. if ($result) {
  41. //updated_at与当前时间差距30分钟以上,则更新日志状态为3
  42. $nowTime = Carbon::now();
  43. $diffTime = $nowTime->diffInMinutes($result->updated_at);
  44. if ($diffTime >= 30) {
  45. $result->status = 3;
  46. $result->request_count = $result->request_count + 1;
  47. $result->save();
  48. }
  49. return [];
  50. }
  51. //找出待发送与发送失败的日志
  52. $result = $log->wherein('status', [0,3])->where('request_count', '<=', 2)->where('send_time', '<', Carbon::now())->limit($limit)->get();
  53. return $result;
  54. }
  55. /*
  56. * 计算Twitter月配额,每月只能发送100个帖子,(只限发送帖子,其他接口,每个用户1个请求,15分钟内只允许发送一次)
  57. *
  58. */
  59. public static function getPostQuota($mediaName = 'Twitter')
  60. {
  61. $log = new Model();
  62. if ($mediaName === 'Twitter') {
  63. // 获取当月第一天 00:00:00 的时间戳
  64. $startOfMonth = Carbon::now()->startOfMonth();
  65. $count = $log->where('media_name', 'Twitter')
  66. ->where('created_at', '>=', $startOfMonth->format('Y-m-d H:i:s'))
  67. ->count();
  68. return 100 - $count;
  69. } elseif ($mediaName === 'YouTube') {
  70. // 获取当天 00:00:00 的时间戳
  71. $startOfDay = Carbon::now()->startOfDay();
  72. $count = $log->where('media_name', 'YouTube')
  73. ->where('created_at', '>=', $startOfDay->format('Y-m-d H:i:s'))
  74. ->count();
  75. // 计算可用配额(向下取整)
  76. $quota = floor((10000 - 1600 * $count) / 1600);
  77. return max($quota, 0); // 保证最小返回0
  78. } else {
  79. return 999;
  80. }
  81. }
  82. /*
  83. * 返回Twitter可以发送的时间
  84. */
  85. public static function getTwitterSendTime()
  86. {
  87. // 将字符串转换为Carbon实例
  88. $sendTimeCarbon = Carbon::now();
  89. $log = new Model();
  90. $query = $log->where('status', 0)
  91. ->where('media_name', 'Twitter')
  92. ->where('send_time', '>=',$sendTimeCarbon->copy()->subMinutes(15))
  93. ->orderByDesc('id')
  94. ->first();
  95. if ($query) {
  96. // 返回格式化的时间字符串(与原输入格式保持一致)
  97. $query_send_time = Carbon::parse($query->send_time);
  98. return $query_send_time
  99. ->addMinutes(16)
  100. ->toDateTimeString();
  101. }
  102. // 没有记录时返回原始字符串
  103. return Carbon::now();
  104. }
  105. /*
  106. * 判断是否可以发送
  107. *
  108. */
  109. public static function twitterCanSend()
  110. {
  111. $log = new Model();
  112. //查找最后一条发送记录
  113. $lastSendLog = $log->wherein('status', [1,2])->where('media_name', 'Twitter')->orderByDesc('id')->first();
  114. //如果时间间隔小于15分钟,则不允许发送
  115. if ($lastSendLog) {
  116. $lastSendTime = Carbon::parse($lastSendLog->send_time);
  117. $nowTime = Carbon::now();
  118. $diffTime = $nowTime->diffInMinutes($lastSendTime);
  119. if ($diffTime <= 15) {
  120. return false;
  121. }
  122. }
  123. return true;
  124. }
  125. }