curlOpen($url);
$res = json_decode($res,true);
if(isset($res['errmsg'])) return [false, $res['errmsg']];
if(! isset($res['access_token'])) return [false, 'request error'];
$token = $res['access_token'];
$expire_time = $res['expires_in']-300;
Redis::set($token_key,$token);
Redis::expire($token_key, $expire_time);
return [true,$token];
}
return [true, $token];
}
public function getPublicWxArticle($data){
list($status, $msg) = $this->rule($data);
if(! $status) {
// file_put_contents('record_ip.txt',date("Y-m-d H:i:s",time()).json_encode($data) . PHP_EOL."来源IP".$msg.PHP_EOL,8);
return [false, 'IP未入白名单'];
}
list($status, $msg) = $this->getToken();
if(! $status) return [false, $msg];
$config = config('qingyaoWx');
$url = sprintf($config['get_article'], $msg);
$offset = empty($data['page_index']) ? 0 : $data['page_index'] - 1;
$count = empty($data['page_size']) || $data['page_size'] > 10 ? 10 : $data['page_size'];
$post = [
'offset' => $offset,
'count' => $count,
'no_content' => 0,
];
$result = $this->curlOpen($url, ['post' => json_encode($post)]);
$result = json_decode($result,true);
if(isset($result['errmsg'])) return [false, $result['errmsg']];
Log::channel('apiLog')->info('wxget', ["message" => $result]);
return [true, ['data' => $result['item'] ?? [], 'total' => $result['total_count'], 'data_count' => $result['item_count']]];
}
public function getPublicWxArticleDetail($data){
list($status, $msg) = $this->rule($data);
if(! $status) {
// file_put_contents('record_ip.txt',date("Y-m-d H:i:s",time()).json_encode($data) . PHP_EOL."来源IP".$msg.PHP_EOL,8);
return [false, 'IP未入白名单'];
}
if(empty($data['article_id'])) return [false, '文章ID不能为空'];
list($status, $msg) = $this->getToken();
if(! $status) return [false, $msg];
$config = config('qingyaoWx');
$url = sprintf($config['get_article_detail'], $msg);
$post = [
'article_id' => $data['article_id'],
];
$result = $this->curlOpen($url, ['post' => json_encode($post)]);
$result = json_decode($result,true);
if(isset($result['errmsg'])) return [false, $result['errmsg']];
return [true, ['data' => $result['news_item'] ?? [] ]];
}
public function getPublicWxMaterial($data){
list($status, $msg) = $this->rule($data);
if(! $status) {
// file_put_contents('record_ip.txt',date("Y-m-d H:i:s",time()).json_encode($data) . PHP_EOL."来源IP".$msg.PHP_EOL,8);
return [false, 'IP未入白名单'];
}
list($status, $msg) = $this->getToken();
if(! $status) return [false, $msg];
$config = config('qingyaoWx');
$url = sprintf($config['get_material'], $msg);
$offset = empty($data['page_index']) ? 1 : $data['page_index'] - 1;
$count = empty($data['page_size']) || $data['page_size'] > 10 ? 10 : $data['page_size'];
$post = [
'offset' => $offset,
'count' => $count,
'type' => 'news',
];
$result = $this->curlOpen($url, ['post' => json_encode($post)]);
$result = json_decode($result,true);
if(isset($result['errmsg'])) return [false, $result['errmsg']];
return [true, ['data' => $result['item'] ?? [], 'total' => $result['total_count'], 'data_count' => $result['item_count']]];
}
public function getPublicWxDraft($data){
list($status, $msg) = $this->rule($data);
if(! $status) {
// file_put_contents('record_ip.txt',date("Y-m-d H:i:s",time()).json_encode($data) . PHP_EOL."来源IP".$msg.PHP_EOL,8);
return [false, 'IP未入白名单'];
}
list($status, $msg) = $this->getToken();
if(! $status) return [false, $msg];
$config = config('qingyaoWx');
$url = sprintf($config['get_draft'], $msg);
$offset = empty($data['page_index']) ? 1 : $data['page_index'] - 1;
$count = empty($data['page_size']) || $data['page_size'] > 10 ? 10 : $data['page_size'];
$post = [
'offset' => $offset,
'count' => $count,
'no_content' => 0,
];
$result = $this->curlOpen($url, ['post' => json_encode($post)]);
$result = json_decode($result,true);
if(isset($result['errmsg'])) return [false, $result['errmsg']];
return [true, ['data' => $result['item'] ?? [], 'total' => $result['total_count'], 'data_count' => $result['item_count']]];
}
public function getWxFile($data){
list($status, $msg) = $this->rule($data);
if(! $status) {
// file_put_contents('record_ip.txt',date("Y-m-d H:i:s",time()).json_encode($data) . PHP_EOL."来源IP".$msg.PHP_EOL,8);
return [false, 'IP未入白名单'];
}
if(empty($data['wx_url'])) return [false, "URL不存在"];
$header = ['Content-Type:application/json'];
list($status,$msg) = $this->get_helper_for_img($data['wx_url'],$header);
if(! $status) return [false, $msg];
return [true, $msg];
}
public function rule($data){
// 获取用户的IP地址
$userIP = $_SERVER['REMOTE_ADDR'];
// 获取设置的IP地址
$allowedIPs = $this->allowedIPs();
if(empty($allowedIPs)) return [false, $userIP];
// 校验用户IP是否在允许的范围内
$isValidIP = false;
foreach ($allowedIPs as $allowedIP) {
if (strpos($allowedIP, '/') !== false) {
// IP段表示法校验
list($subnet, $mask) = explode('/', $allowedIP);
if ((ip2long($userIP) & ~((1 << (32 - $mask)) - 1)) == ip2long($subnet)) {
$isValidIP = true;
break;
}
} else {
// 单个IP地址校验
if ($allowedIP === $userIP) {
$isValidIP = true;
break;
}
}
}
return [$isValidIP, $userIP];
}
public function allowedIPs(){
$allowedIPs = Settings::where('setting_name','allowedIPs')->first();
if(empty($allowedIPs) || empty($allowedIPs->setting_value)) return [];
return explode(',',$allowedIPs->setting_value);
}
public function get_helper_for_img($url,$header=[],$timeout = 20){
if(empty($url)) return [true, ""];
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => $timeout,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_HTTPHEADER => $header,
));
$r = curl_exec($ch);
if ($r === false) {
// 获取错误号
$errorNumber = curl_errno($ch);
// 获取错误信息
$errorMessage = curl_error($ch);
$message = "cURL Error #{$errorNumber}: {$errorMessage}";
Log::channel('apiLog')->info('wx', ["message" => $message]);
return [false, $message];
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 检查是否为图片
if (! $this->isImage($r)) return [false, "资源不是图片"];
if ($httpCode == 200) {
// 检查是否为图片
list($status, $msg) = $this->getTemporaryUrl($r, $url);
if(! $status) return [false, $msg];
$img = $msg;
} else {
return [false, ''];
}
return [true, $img];
}
function isImage($data) {
$imageInfo = getimagesizefromstring($data);
return $imageInfo !== false;
}
//生成临时文件
public function getTemporaryUrl($body,$url)
{
// 定义本地文件路径
list($micro, $seconds) = explode(' ', microtime());
// 从微秒部分截取全部6位作为唯一标识符
$microSuffix = substr($micro, 2, 6);
$name = date('YmdHis', $seconds) . $microSuffix . '.jpg';
$localFilePath = storage_path(self::wx_img . $name);
// 写入文件前先检查文件是否存在
if (! file_exists($localFilePath)) {
// 检查目录是否存在,如果不存在则创建
$directoryPath = dirname($localFilePath);
if (!is_dir($directoryPath)) {
// 设置目录权限,可以根据需要更改
$mode = 0777;
// 使用递归选项创建目录
if (!mkdir($directoryPath, $mode, true)) {
return [false, '目录创建失败'];
}
}
file_put_contents($localFilePath, $body);
}
return [true, $name];
}
public function getArticle(){
// $str = '{"item":[{"article_id":"wEP6ZnQ-KKcHU5uPpYhVi1Ti3u_0Gg7S08iGwgA9PkGkRwt6Yxoib9OawV6vbbjo","content":{"news_item":[{"title":"数字驱动,实现企业持续增长和创新发展","author":"九方","digest":"企业经营管理分为三个维度:个人驱动、流程驱动、数字驱动。","content":"企业经营管理分为三个维度:个人驱动、流程驱动、数字驱动。
个人驱动的最大优点是决策效率高,速度快;缺点是人的思维与生俱来的不稳定性和认知遮蔽带来的片面性有可能导致决策失误,这对企业经营来说是极大的风险敞口。
流程驱动的最大优点是适合工业时代的分工协作模式,把业务流程化,个人只需执行岗位职责即可,极大提升个人的工作效率和规范整个企业的业务动作;缺点是,非常强调流程的结果就是不可避免的带来一些效率的下降。
数据驱动的优点是把企业经营的线下场景数字化、便捷化、可视可控化,对所有生成的的数据进行多维分析,并进而利用分析结果为经营决策提供理性坚实的数据支撑;而缺点,一是方案层面,基于产业端的数字化应用场景对实际业务的适配程度,二是人的方面,基于传统工业模式的惯性思维向数字化思维转型,这两点客观来讲都会不可避免的经历一个过程,需要用时间换空间。
在这个过程中,一是需要数字化解决方案的规划者要真正在行业中沉淀下来,在理解行业的基础上为企业做出真正契合企业需求,解决行业痛点的解决方案;二是在数字化建设转型过程中,面对困难要能够如实的彻见,数字化转型不光是业务的数字化转型,还有人的思维的数字化转型,一定会经历一个初步建立并逐步完善的过程,任何组织都不可能一蹴而就,以这个洞见为前提,才会拥有一个好的心态和规划。
所以对于数字化,无论政府部门还是企业部门,都应该以开放、包容的心态去积极拥抱,并勇于探索。中国用20年的时间把消费互联网做到了规模全球第一,希望再用20年来推进产业互联网的发展,以全面数字化为抓手,完成中国的弯道超车,实现中华民族的伟大复兴。
重要声明
本公众号旨在提供有关青爻科技的一般信息,而并非对任何服务或产品的推介或要约。不应将本公众号任何内容视为法规、税务、会计、投资或其他专业咨询建议。本公众号对资料的准确性、完整性或可靠性不作任何明示或暗示的陈述或保证。本公众号对发布的任何内容的变更不会另行通知,本公众号也没有义务更新已发布的任何内容。青爻科技任何管理人员、雇员或代理人均不对因使用本公众号所载任何信息而产生的任何损失或损害承担任何责任。本文所引用的内容,包括但不限于文字、图片、数据、观点等,均来源于网络或公开发表的资料。本文在引用时,已尽力查明原作者和出处,并会进行标注。若因技术原因或信息来源的不确定性,导致部分引用未能明确标注原作者或出处,我们深表歉意,并愿意在得知后第一时间进行更正。我们尊重每一位原创者的劳动成果和知识产权,本文的引用仅为传播信息、分享知识之目的,并非用于商业用途。如有任何引用不当或侵犯了他人的著作权、知识产权等权益,我们深表歉意,并将立即删除或更正相关内容。请原创者和相关权益人理解,并联系我们进行协商处理。同时,我们也呼吁广大读者,尊重知识产权,共同维护一个健康、和谐的网络环境。感谢您的理解与支持,如有任何侵权问题,请通过公众号留言或电子邮件与我们联系,我们将尽快给予回复和处理。
","content_source_url":"","thumb_media_id":"lffoQzaBC9EaQtS0rs5Lcpk_4LbHwlIRj0g0cmp7WQTXq9yyCKKlHUt3ZrGQ6Idp","show_cover_pic":0,"url":"http://mp.weixin.qq.com/s?__biz=Mzg4ODUzOTkzNw==&mid=2247483799&idx=1&sn=9c409bd3dcd9d6753c47394d5ae97f59&chksm=cff8dfd9f88f56cf4034345f990253eebd68ca021f76fbcb7e448bead1f8c3c4519629316d5e#rd","thumb_url":"https://mmbiz.qpic.cn/mmbiz_jpg/SpEibFiaCIZFhr1IIzwUickXzhaPlg5R7mW5mTicOxZRduLjtzYRwoP1aTHACtPL00qMJuGgnMxiarCqqyuLXuhj4rg/0?wx_fmt=jpeg","need_open_comment":0,"only_fans_can_comment":0,"is_deleted":false}],"create_time":1716874992,"update_time":1716875023},"update_time":1716875023},{"article_id":"wEP6ZnQ-KKcHU5uPpYhVi699EtiYW7gAssi3GuI36k_xjhUcuegDNG-IC65IH8Fe","content":{"news_item":[{"title":"中国企业数字化转型的三步走模型","author":"青丘之山","digest":"中国消费互联网凭借庞大的人口基数以及由此形成的消费市场,在过去的20年里一路狂奔,大幅领先于其他国家,基于所见所得的事实,就这一点而言,中国的民众具有相当的优越感。","content":"
![]()
青爻科技,用物联网技术赋能制造业,推动产业链数字化转型。
中国消费互联网凭借庞大的人口基数以及由此形成的消费市场,在过去的20年里一路狂奔,大幅领先于其他国家,基于所见所得的事实,就这一点而言,中国的民众具有相当的优越感。但另一个事实是,消费互联网目前的发展势头趋近边际失速,当下的发展空间已经接近天花板,而产业互联网的发展水平却远远落后于美国。
![]()
中国先进的消费互联网与相对落后的产业互联网之间有着巨大的发展落差。
![]()
当前中国的产业市场面临的窘境是:工业时代形成的传统生产协作模式已经大幅滞后于数字化时代的发展,并且不能适配由消费互联网的蓬勃发展而逐渐发育出的先进数字化生态,主要体现如下:一方面消费侧引领下的数字化进程已经极大改变中国社会运行状态,受益于此,全社会生产力水平得到了相当程度的提高;另一方面,产业侧现有的基础生产关系还在沿用工业时代形成的,用于匹配分工协作的工业生产模式。这就产生一个矛盾:落后的生产模式难以适应先进消费模式下的社会需求。在这一矛盾下的企业众生相大致呈现出三张图景:一是春江水暖鸭先知——起步于消费互联网的互联网原生企业早就在数字化领域如鱼得水,心剑合一,并逐步站在了数字生态链的顶端,我们称之为数字化原生企业;二是近水楼台先得月——靠近消费侧的线下企业也较早感知到压力,经营得当并及时转型的企业,目前大致也都在信息化、数字化进程上走了一段路程,具备了基本的数字化能力,我们称之为数字化近端企业;三是后知后觉或者尚未觉知的企业——这部分是离消费互联网较远的行业,普遍具有业务场景复杂,价值链、产业链较长等特征,我们称其为数字化远端企业。![]()
中国传统行业对未来发展趋势要有前瞻性,要破旧立新,大胆变革。
![]()
中国产业互联网要向纵深发展,要提升全社会生产力整体水平,重点是要在传统行业,在数字化远端企业上发力。提升传统行业的数字化水平,使其满足数字生产力对于信用、敏捷、效率、创新等方面的需求。传统行业要进行大胆的变革,敢于打破落后陈旧、效率低下的生产协作模式和商业模式,对管理制度、组织架构、组织能力进行升级迭代,提高内部组织、外部供应链的协同效率,并积极探索传统业务与数字化融合的方式方法,做好数字化转型的顶层设计和整体规划,以积极稳妥、分步实施的方式,坚定推进企业数字化转型。![]()
中国产业侧当前的信息化水平大幅落后于美、德等发达国家。
![]()
从工业革命至今,全球主流国家分别经历了1.0工业化时代,2.0信息化时代和3.0数字化时代。发达国家较早进入工业化时代并完成工业化,并且由于计算机的普及、成熟的商业环境和系统的现代企业管理文化,也较早进入信息化时代,因此普遍信息化程度较高。而中国由于众所周知的原因,进入工业化时代较晚,但赶超力度大,追赶期较短,目前已经进入到后工业化时代,并逐步建立起独步全球的最大规模的全产业链体系。然而在粗放式发展的工业化进程中,大部分中国企业一切以业务为核心,以业务为导向,现代企业管理制度缺位,管理者、劳动者素质参差不齐,商业、法制环境不成熟,因此信息化在中国,尤其是企业间的普及率、完成度并不理想,导致整体信息化程度不高。现实来看,美国、德国等发达国家工业信息化程度较高,中国的产业侧信息化程度则要远远落后于上述两个国家,相当于信息化还没建设好,又要进入数字化时代了。基于这个客观情况,虽然长期来看是实现弯道超车的重大机遇,但立足当下,要实现越级而立还需要克服非常多的挑战。比较乐观的是,由于消费互联网这些年在中国的蓬勃发展,使得中国社会无形中经历并接受了一次数字化现实场景的全民教育,以此为契机,消费互联网一定会反向拉动产业互联网的快速发展。![]()
以三步走的方式,实现企业数字化的稳妥转型。
![]()
需要重视的是,所谓江山易改本性难移,数字化转型首先要改变的就是人的思维。企业管理者一定要重新审视基于工业时代的传统经营管理思维,并逐步革新、建立起面向新时代的数字化经营管理思维,以三步走的方式,实现企业数字化的稳妥转型:
第一步,以解决关键业务的核心痛点为抓手,首先把关键业务进行信息化部署,企业负责人和关键部门的关键岗位、关键人员适应信息化管理,并初步建立起数字化思维。第二步,以数字化转型为抓手,以业务为导向,进行组织变革,把企业内部各业务部门进行打通,让数据在企业内部可以无障碍流动,进而实现企业各部门、各岗位的高质、高效协作。第三步,根据企业业务,将数据与市场对接,实现数据在产业链上的打通,使得数据在产业链上下游无障碍流动,并进而利用数据指导业务,辅助决策,最终建立起一个敏捷响应、精细高效的数字化企业。![]()
数字化转型不是一个静态的目标,而是一个逐步建立,逐步迭代,不断完善的发展动态。
![]()
当然,企业完成了第三步也并不意味着就完成了整个的数字化转型,所谓的数字化转型不是一个静态的目标,而是一个逐步建立,逐步迭代,不断完善的发展动态。所以,任何企业在开启数字化转型之路前,一定要对此有着清晰的认知和心理准备,既要准备好人,也要准备好耐心,做时间的朋友。所以,基于产业互联网的数字化建设一定是一个整体部署、分步实施、大胆探索、小心求证的过程。在整个数字化建设进程中,人是最大的制约因素,而不是技术,人的数字化思维与企业的数字化建设一定是一个你追我赶,螺旋上升,最终相互成就的过程。最后,也是最重要的一点,数字化是一套全新的体系,数字化思维也是一套全新的思维体系,企业管理者一定要逐步建立这样一套思维体系,并相信这套体系,坚定执行它的逻辑,最终实现它!![]()
THE END
青爻科技:专注于数字化赋能
![]()
重要声明
本公众号旨在提供有关青爻科技的一般信息,而并非对任何服务或产品的推介或要约。不应将本公众号任何内容视为法规、税务、会计、投资或其他专业咨询建议。本公众号对资料的准确性、完整性或可靠性不作任何明示或暗示的陈述或保证。本公众号对发布的任何内容的变更不会另行通知,本公众号也没有义务更新已发布的任何内容。青爻科技任何管理人员、雇员或代理人均不对因使用本公众号所载任何信息而产生的任何损失或损害承担任何责任。
©2024年 杭州青爻科技有限公司。版权所有。
","content_source_url":"","thumb_media_id":"lffoQzaBC9EaQtS0rs5LchcDt8D5EmKWAy-pSh2ot2X0rg8EX49d-FddZU_74mUh","show_cover_pic":0,"url":"http://mp.weixin.qq.com/s?__biz=Mzg4ODUzOTkzNw==&mid=2247483794&idx=1&sn=b465dc78a07d5eedbc299c4c76d78cf7&chksm=cff8dfdcf88f56ca140bff6bad88df17c86d7be67cbb11c42372bf133ba353bb6be6787fe240#rd","thumb_url":"https://mmbiz.qpic.cn/mmbiz_jpg/SpEibFiaCIZFhw3kfCV3BPyRVtjc5iahiaLlO4mr0IozLia4rpVavpTbiajGbd23mb8tsdjAot0picibKib3f2Emqyhic1Eg/0?wx_fmt=jpeg","need_open_comment":0,"only_fans_can_comment":0,"is_deleted":false}],"create_time":1716777294,"update_time":1716777337},"update_time":1716777337}],"total_count":2,"item_count":2}';
// $result = json_decode($str,true);
// //保存文章
// list($status,$msg) = $this->saveWxArticle($result);
// if(! $status) return [false, $msg];dd(1);
list($status, $msg) = $this->getToken();
if(! $status) return [false, $msg];
$config = config('qingyaoWx');
$url = sprintf($config['get_article'], $msg);
$offset = 0;
$count = 20;
$get_total = 0;
do {
$post = [
'offset' => $offset,
'count' => $count,
'no_content' => 0,
];
$result = $this->curlOpen($url, ['post' => json_encode($post)]);
$result = json_decode($result, true);
Log::channel('apiLog')->info('wxget', ["message" => $result]);
if (isset($result['errmsg'])) return [false, $result['errmsg']];
//保存文章
list($status,$msg) = $this->saveWxArticle($result);
if(! $status) return [false, $msg];
// 更新 offset
$offset += 1;
// 更新 total_count
$get_total += $result['total_count'];
// 检查是否还有更多数据
$hasMore = isset($result['total_count']) && ($result['total_count'] > $get_total);
} while ($hasMore);
return [true, ''];
}
public function saveWxArticle($result){
if(! empty($result['item'])){
try {
DB::beginTransaction();
//保存数据
$upload = $delete = [];
foreach ($result['item'] as $value){
$model = WxArticle::where('del_time',0)
->where('article_id', $value['article_id'])
->first();
if(empty($model)){
$model = new WxArticle();
$model->article_id = $value['article_id'];
$model->upd_time = $value['update_time'];
$model->save();
$id = $model->id;
if(! empty($value['content']['news_item'])){
foreach ($value['content']['news_item'] as $val){
// 获取当前时间的微秒级时间戳
list($micro, $seconds) = explode(' ', microtime());
// 从微秒部分截取全部6位作为唯一标识符
$microSuffix = substr($micro, 2, 6);
$content_name = date('YmdHis', $seconds) . $microSuffix;
list($content_img,$name) = $this->saveContent($val['content'], $content_name);
list($status, $my_thumb_url) = $this->get_helper_for_img($val['thumb_url']);
$modelDetail = new WxArticleDetail();
$modelDetail->wx_article_id = $id;
$modelDetail->title = $val['title'];
$modelDetail->author = $val['author'];
$modelDetail->digest = $val['digest'];
$modelDetail->content_name = $name;
$modelDetail->content_source_url = $val['content_source_url'];
$modelDetail->thumb_media_id = $val['thumb_media_id'];
$modelDetail->show_cover_pic = $val['show_cover_pic'];
$modelDetail->url = $val['url'];
$modelDetail->thumb_url = $val['thumb_url'];
$modelDetail->my_thumb_url = $my_thumb_url;
$modelDetail->need_open_comment = $val['need_open_comment'];
$modelDetail->only_fans_can_comment = $val['only_fans_can_comment'];
$modelDetail->is_deleted = $val['is_deleted'];
$modelDetail->upd_time = $value['content']['update_time'];
$modelDetail->crt_time = $value['content']['create_time'];
$modelDetail->save();
if(! empty($content_img)){
$insert = [];
foreach ($content_img as $value){
$upload[] = $value;
$insert[] = [
'wx_article_detail_id' => $modelDetail->id,
'url' => $value
];
}
WxArticleDetailContent::insert($insert);
}
if(! empty($name)) $upload[] = $name;
if(! empty($my_thumb_url)) $upload[] = $my_thumb_url;
}
}
}else{
if($model->upd_time != $value['update_time']){
$model->upd_time = $value['update_time'];
$model->save();
$id = $model->id;
$detail = WxArticleDetail::where('del_time',0)
->where('wx_article_id',$id)
->select('content_name as txt','thumb_url as img','id')
->get()->toArray();
WxArticleDetail::where('del_time',0)
->where('wx_article_id',$id)
->update(['del_time' => time()]);
$detail2 = WxArticleDetailContent::where('del_time',0)
->whereIn('id', array_column($detail,'id'))
->select('url as img')
->get()->toArray();
WxArticleDetailContent::where('del_time',0)
->whereIn('id', array_column($detail,'id'))
->update(['del_time' => time()]);
if(! empty($value['content']['news_item'])){
foreach ($value['content']['news_item'] as $val){
// 获取当前时间的微秒级时间戳
list($micro, $seconds) = explode(' ', microtime());
// 从微秒部分截取全部6位作为唯一标识符
$microSuffix = substr($micro, 2, 6);
$content_name = date('YmdHis', $seconds) . $microSuffix;
list($content_img,$name) = $this->saveContent($val['content'], $content_name);
list($status, $my_thumb_url) = $this->get_helper_for_img($val['thumb_url']);
$modelDetail = new WxArticleDetail();
$modelDetail->wx_article_id = $id;
$modelDetail->title = $val['title'];
$modelDetail->author = $val['author'];
$modelDetail->digest = $val['digest'];
$modelDetail->content_name = $name;
$modelDetail->content_source_url = $val['content_source_url'];
$modelDetail->thumb_media_id = $val['thumb_media_id'];
$modelDetail->show_cover_pic = $val['show_cover_pic'];
$modelDetail->url = $val['url'];
$modelDetail->thumb_url = $val['thumb_url'];
$modelDetail->my_thumb_url = $my_thumb_url;
$modelDetail->need_open_comment = $val['need_open_comment'];
$modelDetail->only_fans_can_comment = $val['only_fans_can_comment'];
$modelDetail->is_deleted = $val['is_deleted'];
$modelDetail->upd_time = $value['content']['update_time'];
$modelDetail->crt_time = $value['content']['create_time'];
$modelDetail->save();
if(! empty($content_img)){
$insert = [];
foreach ($content_img as $value){
$upload[] = $value;
$insert[] = [
'wx_article_detail_id' => $modelDetail->id,
'url' => $value
];
}
WxArticleDetailContent::insert($insert);
}
if(! empty($name)) $upload[] = $name;
if(! empty($my_thumb_url)) $upload[] = $my_thumb_url;
}
}
foreach ($detail as $value){
if(! empty($value['txt'])) $delete[] = $value['txt'];
if(! empty($value['img'])) $delete[] = $value['img'];
}
foreach ($detail2 as $value){
if(! empty($value['img'])) $delete[] = $value['img'];
}
}
}
}
//上传阿里云
$service = new FileUploadService();
$service->createOssUploadWx($upload);
$service->createOssDeleteWx($delete);
DB::commit();
return [true, ''];
}catch (\Throwable $exception){
DB::rollBack();
return [false, $exception->getMessage() . '|' . $exception->getLine() . '|' . $exception->getFile()];
}
}
return [false, '暂无数据'];
}
//生成临时文件
public function saveContent($content, $name)
{
// 定义本地文件路径
$name = $name . '.txt';
$localFilePath = storage_path(self::wx_img . $name);
// 写入文件前先检查文件是否存在
if (! file_exists($localFilePath)) {
// 检查目录是否存在,如果不存在则创建
$directoryPath = dirname($localFilePath);
if (!is_dir($directoryPath)) {
// 设置目录权限,可以根据需要更改
$mode = 0777;
// 使用递归选项创建目录
if (!mkdir($directoryPath, $mode, true)) {
return [false, '目录创建失败'];
}
}
list($content, $img) = $this->dealContent($content);
file_put_contents($localFilePath, $content);
}
return [$img ?? [], $name];
}
public function dealContent1($content){
// 正则表达式匹配 data-src 属性
$pattern = '/data-src="([^"]+)"/';
// 替换 data-src 为 src
$replacedString = preg_replace($pattern, 'src="$1"', $content);
return [$replacedString, []];
}
public function dealContent($content){
// 正则表达式匹配 data-src 属性
$pattern = '/data-src="([^"]+)"/';
// 匹配所有 data-src 属性
preg_match_all($pattern, $content, $matches);
// 提取所有匹配到的 URL
$urls = $matches[1];
$return = [];
$header = ['Content-Type:application/json'];
// 遍历每个匹配项并替换
foreach ($urls as $url) {
list($status, $msg) = $this->get_helper_for_img($url,$header);
if($status){
$newImageUrl = $msg;
// 构建完整的 data-src 属性
$oldDataSrc = 'data-src="' . $url . '"';
$newDataSrc = 'src="' . $newImageUrl . '"';
// 替换
$content = str_replace($oldDataSrc, $newDataSrc, $content);
$return[] = $msg;
}
}
return [$content,$return];
}
public function delFile($detail){
if(empty($detail)) return;
$dir = Self::dir;
foreach ($detail as $value){
if(isset($value['txt'])){
$dir_content = $dir . $value['txt'] . '.txt';
if(Storage::disk('public')->exists($dir_content)) Storage::disk('public')->delete($dir_content);
}
if(! empty($value['img'])){
$dir_thumb = $dir . md5($value['img']) . '.jpg';
if(Storage::disk('public')->exists($dir_thumb)) Storage::disk('public')->delete($dir_thumb);
}
}
}
public function getArticleList($data){
// list($status, $msg) = $this->rule($data);
// if(! $status) {
// file_put_contents('record_ip.txt',date("Y-m-d H:i:s",time()).json_encode($data) . PHP_EOL."来源IP".$msg.PHP_EOL,8);
// return [false, 'IP未入白名单'];
// }
$model = WxArticleDetail::where('del_time',0)
->where('is_deleted', 0)
->select('title','author','digest','thumb_url','id','crt_time','my_thumb_url')
->orderBy('crt_time','desc');
$list = $this->limit($model,'',$data);
//组织数据
$list = $this->organizationData($list);
return [true, $list];
}
public function organizationData($data){
if(empty($data['data'])) return $data;
$service = new FileUploadService();
foreach ($data['data'] as $key => $value){
$data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i", $value['crt_time']) : "";
$data['data'][$key]['my_thumb_url'] = $service->getFileShowWx($value['my_thumb_url']);
}
return $data;
}
public function getArticleContent($data){
// list($status, $msg) = $this->rule($data);
// if(! $status) {
// file_put_contents('record_ip.txt',date("Y-m-d H:i:s",time()).json_encode($data) . PHP_EOL."来源IP".$msg.PHP_EOL,8);
// return [false, 'IP未入白名单'];
// }
if(empty($data['id'])) return [false, 'ID不能为空'];
$detail = WxArticleDetail::where('id',$data['id'])->first();
if(empty($detail)) return [false, '文章不存在或已被删除'];
$detail = $detail->toArray();
if($detail['is_deleted']) return [false, '文章不存在或被删除'];
if(empty($detail['content_name'])) return [true, ['content' => '']];
//获取文件
$service = new FileUploadService();
$content = $service->getFileShowWx($detail['content_name']);
// 读取文件内容
$fileContent = file_get_contents($content);
$fileContent = $this->dealContent2($fileContent);
$detail['content'] = $fileContent;
return [true, ['data' => $detail]];
}
public function dealContent2($content){
// 正则表达式匹配 data-src 属性
$pattern = '/src="([^"]+)"/';
// 匹配所有 data-src 属性
preg_match_all($pattern, $content, $matches);
// 提取所有匹配到的 URL
$urls = $matches[1];
// 遍历每个匹配项并替换
$service = new FileUploadService();
foreach ($urls as $url) {
$newImageUrl = $service->getFileShowWx($url);
$oldDataSrc = 'src="' . $url . '"';
$newDataSrc = 'src="' . $newImageUrl . '"';
// 替换
$content = str_replace($oldDataSrc, $newDataSrc, $content);
}
return $content;
}
}