优化内容库
This commit is contained in:
@@ -12,6 +12,7 @@ use think\facade\Env;
|
||||
use app\api\model\WechatFriendModel as WechatFriend;
|
||||
use app\api\model\WechatMomentsModel as WechatMoments;
|
||||
use think\facade\Cache;
|
||||
use app\common\util\AliyunOSS;
|
||||
|
||||
|
||||
class WebSocketController extends BaseController
|
||||
@@ -473,7 +474,23 @@ class WebSocketController extends BaseController
|
||||
}
|
||||
if ($message['cmdType'] == 'CmdDownloadMomentImagesResult' && is_array($message['urls']) && count($message['urls']) > 0) {
|
||||
$urls = json_encode($message['urls'], 256);
|
||||
Db::table('s2_wechat_moments')->where('snsId', $data['snsId'])->update(['resUrls' => $urls]);
|
||||
|
||||
// 上传图片到OSS
|
||||
$ossUrls = $this->uploadMomentImagesToOss($message['urls'], $data['snsId']);
|
||||
|
||||
// 更新数据库:保存原始URL和OSS URL,并标记已上传
|
||||
$updateData = [
|
||||
'resUrls' => $urls,
|
||||
'isOssUploaded' => 1, // 标识已上传到OSS
|
||||
'update_time' => time()
|
||||
];
|
||||
|
||||
// 如果有OSS URL,保存到ossUrls字段
|
||||
if (!empty($ossUrls)) {
|
||||
$updateData['ossUrls'] = json_encode($ossUrls, 256);
|
||||
}
|
||||
Db::table('s2_wechat_moments')->where('snsId', $data['snsId'])->update($updateData);
|
||||
|
||||
}
|
||||
return json_encode(['code' => 200, 'msg' => '获取朋友圈资源链接成功', 'data' => $message]);
|
||||
} catch (\Exception $e) {
|
||||
@@ -495,6 +512,95 @@ class WebSocketController extends BaseController
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传朋友圈图片到OSS
|
||||
* @param array $urls 图片URL数组
|
||||
* @param string $snsId 朋友圈ID
|
||||
* @return array OSS URL数组
|
||||
*/
|
||||
protected function uploadMomentImagesToOss($urls, $snsId)
|
||||
{
|
||||
$ossUrls = [];
|
||||
|
||||
if (empty($urls) || !is_array($urls)) {
|
||||
return $ossUrls;
|
||||
}
|
||||
|
||||
try {
|
||||
// 创建临时目录(兼容无 runtime_path() 辅助函数的环境)
|
||||
if (function_exists('runtime_path')) {
|
||||
$baseRuntimePath = rtrim(runtime_path(), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
|
||||
} elseif (defined('RUNTIME_PATH')) {
|
||||
$baseRuntimePath = rtrim(RUNTIME_PATH, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
|
||||
} else {
|
||||
// 兜底:使用项目根目录下的 runtime 目录
|
||||
$baseRuntimePath = rtrim(ROOT_PATH, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'runtime' . DIRECTORY_SEPARATOR;
|
||||
}
|
||||
|
||||
$tempDir = $baseRuntimePath . 'temp' . DIRECTORY_SEPARATOR . 'moments' . DIRECTORY_SEPARATOR . date('Y' . DIRECTORY_SEPARATOR . 'm' . DIRECTORY_SEPARATOR . 'd') . DIRECTORY_SEPARATOR;
|
||||
|
||||
if (!is_dir($tempDir)) {
|
||||
mkdir($tempDir, 0755, true);
|
||||
}
|
||||
|
||||
foreach ($urls as $index => $url) {
|
||||
if (empty($url)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
// 下载图片到临时文件
|
||||
$tempFile = $tempDir . md5($url . $snsId . $index) . '.jpg';
|
||||
|
||||
// 使用curl下载图片
|
||||
$ch = curl_init($url);
|
||||
$fp = fopen($tempFile, 'wb');
|
||||
curl_setopt($ch, CURLOPT_FILE, $fp);
|
||||
curl_setopt($ch, CURLOPT_HEADER, 0);
|
||||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||||
curl_exec($ch);
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
fclose($fp);
|
||||
|
||||
if ($httpCode != 200 || !file_exists($tempFile) || filesize($tempFile) == 0) {
|
||||
Log::warning('下载朋友圈图片失败:' . $url . ', HTTP Code: ' . $httpCode);
|
||||
@unlink($tempFile);
|
||||
continue;
|
||||
}
|
||||
|
||||
// 生成OSS对象名称
|
||||
$objectName = 'moments/' . date('Y/m/d/') . md5($snsId . $index . time()) . '.jpg';
|
||||
|
||||
// 上传到OSS
|
||||
$result = AliyunOSS::uploadFile($tempFile, $objectName);
|
||||
if ($result['success']) {
|
||||
$ossUrls[] = $result['url'];
|
||||
Log::info('朋友圈图片上传OSS成功:' . $url . ' -> ' . $result['url']);
|
||||
} else {
|
||||
Log::error('朋友圈图片上传OSS失败:' . $url . ', 错误:' . ($result['error'] ?? '未知错误'));
|
||||
}
|
||||
|
||||
// 删除临时文件
|
||||
@unlink($tempFile);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error('上传朋友圈图片到OSS异常:' . $e->getMessage() . ', URL: ' . $url);
|
||||
if (isset($tempFile) && file_exists($tempFile)) {
|
||||
@unlink($tempFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error('上传朋友圈图片到OSS异常:' . $e->getMessage());
|
||||
}
|
||||
|
||||
return $ossUrls;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存朋友圈数据到数据库
|
||||
* @param array $momentList 朋友圈数据列表
|
||||
@@ -514,11 +620,14 @@ class WebSocketController extends BaseController
|
||||
// 提取momentEntity中的数据
|
||||
$momentEntity = $moment['momentEntity'] ?? [];
|
||||
|
||||
// 检查朋友圈数据是否已存在
|
||||
$momentId = WechatMoments::where('snsId', $moment['snsId'])
|
||||
// 检查朋友圈数据是否已存在,并获取isOssUploaded状态
|
||||
$existingMoment = Db::table('s2_wechat_moments')
|
||||
->where('snsId', $moment['snsId'])
|
||||
->where('wechatAccountId', $wechatAccountId)
|
||||
->value('id');
|
||||
|
||||
->find();
|
||||
|
||||
$momentId = $existingMoment['id'] ?? null;
|
||||
$isOssUploaded = isset($existingMoment['isOssUploaded']) ? (int)$existingMoment['isOssUploaded'] : 0;
|
||||
|
||||
$dataToSave = [
|
||||
'commentList' => json_encode($moment['commentList'] ?? [], 256),
|
||||
@@ -540,7 +649,7 @@ class WebSocketController extends BaseController
|
||||
];
|
||||
|
||||
if (!empty($momentId)) {
|
||||
// 如果已存在,则更新数据
|
||||
// 如果已存在,则更新数据(保留isOssUploaded和ossUrls字段,不覆盖)
|
||||
Db::table('s2_wechat_moments')->where('id', $momentId)->update($dataToSave);
|
||||
} else {
|
||||
if (empty($wechatFriendId)) {
|
||||
@@ -550,12 +659,18 @@ class WebSocketController extends BaseController
|
||||
$dataToSave['wechatAccountId'] = $wechatAccountId;
|
||||
$dataToSave['wechatFriendId'] = $wechatFriendId ?? 0;
|
||||
$dataToSave['create_time'] = time();
|
||||
$dataToSave['isOssUploaded'] = 0; // 新记录默认为未上传
|
||||
$res = WechatMoments::create($dataToSave);
|
||||
}
|
||||
|
||||
|
||||
// 获取资源链接
|
||||
if(empty($momentEntity['resUrls']) && !empty($momentEntity['urls']) && $moment['type'] == 1) {
|
||||
// 获取资源链接(检查是否已上传到OSS,如果已上传则跳过)
|
||||
if(empty($momentEntity['urls']) || $moment['type'] != 1) {
|
||||
// 如果没有urls或类型不是1,跳过
|
||||
} elseif ($isOssUploaded == 1) {
|
||||
// 如果已上传到OSS,跳过采集
|
||||
Log::info('朋友圈图片已上传到OSS,跳过采集。snsId: ' . $moment['snsId']);
|
||||
} else {
|
||||
// 未上传到OSS,执行采集
|
||||
$snsData = [
|
||||
'snsId' => $moment['snsId'],
|
||||
'snsUrls' => $momentEntity['urls'],
|
||||
|
||||
Reference in New Issue
Block a user